Podpora eliptických kriviek (ECC)

RSA-2048 sa stáva čoraz viac nezabezpečeným

Nemecký Spolkový úrad pre informačnú bezpečnosť (Bundesamt für Sicherheit in der Informationstechnik, BSI) už z bezpečnostných dôvodov neodporúča používať kľúče RSA s dĺžkou 2048 bitov po roku 2023. To znamená, že v dohľadnej budúcnosti sa budú musieť začať používať dlhšie kľúče. Za predpokladu obdobia používania päť rokov je už teraz potrebné generovať dlhšie kľúče. Dlhšie kľúče RSA s 3072 bitmi alebo 4096 bitmi sú však výrazne pomalšie. Z tohto dôvodu nový Nitrokey Storage 2 a Pro 2 (resp. integrovaná karta OpenPGP vo verzii 3.3) podporuje šifrovanie pomocou eliptic-curve cryptography (ECC). Táto metóda sa považuje za rovnako bezpečnú pri menších kľúčoch ECC ako pri dlhších kľúčoch RSA a je aj podstatne rýchlejšia.

Základy kryptografie eliptickej krivky

Na rozdiel od RSA existuje mnoho rôznych foriem (tzv. kriviek) eliptickej kryptografie. Je pozoruhodné, že NSA sa podieľala na vývoji kriviek NIST. Aj keď v krivkách nie sú žiadne dôkazy o zadných dvierkach, používanie určitej krivky môže predstavovať otázku dôveryhodnosti. Našťastie nové zariadenia Nitrokey Storage 2 a Pro 2 podporujú dva druhy kriviek, a to NIST a Brainpool. V nasledujúcom texte budeme používať krivky Brainpool. Tento článok poskytuje dobrý vstupný bod na získanie všeobecných poznatkov o kryptografii eliptických kriviek.

Systémové požiadavky

Na vytvorenie kľúčov založených na eliptických krivkách je potrebné úložisko Nitrokey Storage 2 / Pro 2 a GnuPG vo verzii 2.1.17 alebo vyššej.

Verziu karty OpenPGP od spoločnosti Nitrokey si môžete prečítať prostredníctvom gpg2 --card-status:

> gpg2 --card-status
Reader ...........: 20A0:...
Application ID ...: D276...
Version ..........: 3.3
...

Pole „Verzia“ predstavuje verziu karty OpenPGP integrovanú v kľúči Nitrokey - v tomto prípade je to verzia 3.3 potrebná pre kryptografiu eliptickej krivky. Karta OpenPGP vo verzii 2.2 nepodporuje ECC.

Nainštalovanú verziu GnuPG môžete zistiť prostredníctvom gpg2  --version. Vyžaduje sa minimálne verzia 2.1.16. Najnovšiu verziu GnuPG pre Windows nájdete `tu<https://www.gpg4win.org/>`__ a najnovšiu verziu pre MacOS nájdete `tu<https://gpgtools.org/>`__. Vhodná verzia GnuPG je súčasťou distribúcií GNU/Linux Ubuntu (od verzie 18.04), Debian (od verzie Stretch), Arch Linux, Fedora (od verzie 26) a openSUSE Tumbleweed. Na konci tohto článku sú pokyny, ako ručne aktualizovať GnuPG v starších verziách Ubuntu.

Dôležité

GnuPG 2.0 sa stále používa, ale jeho podpora bola v roku 2017 ukončená. Všetci komunikační partneri musia na šifrovanie e-mailov pomocou ECC používať GnuPG 2.1 alebo novšiu verziu, inak by mohli vzniknúť problémy s nekompatibilitou. Preto by ste mali používať ECC len vtedy, ak ste si istí, že tento problém dokážete obísť.

Generovanie kľúčov na zariadení Nitrokey Storage 2 / Pro 2

Po splnení týchto požiadaviek môžete začať. (Upozornenie: existujúce kľúče budú v tomto procese prepísané!) Teraz máte dve možnosti. Prvou možnosťou je vytvoriť kľúč priamo v zariadení Nitrokey Storage 2 / Pro 2. Výhodou je, že kľúč sa nikdy nebude nachádzať mimo zariadenia a ako taký ho nebude možné prečítať. Druhou možnosťou je importovať predtým lokálne vytvorený kľúč. Výhodou v tomto prípade je, že si môžete bezpečne uložiť zálohu kľúča, ktorú potom môžete obnoviť v prípade straty kľúča Nitrokey. Nižšie je opísaná len prvá možnosť. Na vytvorenie kľúča so zálohou môžete pristupovať k nasledujúcim pokynom a použiť tieto všeobecné informácie na prenos kľúča do Nitrokey.

V GnuPG už existuje príkaz „generate“, ktorý možno použiť na jednoduché vytvorenie kľúčov v zariadení. Zatiaľ však nie je možné priamo vybrať typ kľúča, preto je potrebné kľúč najprv pripraviť. Na tento účel používame nasledujúce príkazy:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 brainpoolP256r1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 brainpoolP256r1" /bye

Prípadne sa môžu vybrať iné krivky, ako je opísané v nasledujúcej časti.

Teraz zadáme gpg2 --card-edit a vidíme, že brainpoolP256r1 je v položke „key attributes“ namiesto rsa2048.

> gpg2 --card-edit
Reader ...........: 20A0:4109:0000000000000:0
Application ID ...: D276000124010303000500005F100000
Version ..........: 3.3
Manufacturer .....: ZeitControl
Serial number ....: 00005F10
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: brainpoolP256r1 brainpoolP256r1 brainpoolP256r1
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Potom vytvoríme kľúč.

gpg/card> admin
Admin commands are allowed

gpg/card> generate
Make off-card backup of encryption key? (Y/n) n
Please note that the factory settings of the PINs are
PIN = '123456' Admin PIN = '12345678'
You should change them using the command --change-pin
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Jane Doe
Email address: jane.doe@example.org
Comment:
You selected this USER-ID:
"Jane Doe <jane.doe@example.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
gpg: key 7F8C68E1B084E169 marked as ultimately trusted
gpg: revocation certificate stored as '/home/jane/.gnupg/openpgp-revocs.d/F8C00BC1636A7D7604A31A877F8C68E1B084E169.rev'
public and secret key created and signed.

Kľúč Nitrokey teraz namiesto kľúčov RSA obsahuje kryptografiu eliptickej krivky a môže sa používať ako zvyčajne.

Dostupné krivky

V uvedenom postupe sme zvolili krivky Brainpool. Alternatívne je možné použiť krivky NIST. Konfigurácia sa vykonáva takto:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 nistp256" /bye

Aktualizácia GnuPG v Ubuntu

Nasledujúce kroky sú potrebné len v prípade, že používate Ubuntu staršie ako 18.04. Na takýto systém môžete nainštalovať GnuPG 2.1.18 pomocou nižšie uvedených príkazov. Ide o novšie balíky Debianu, čo je najjednoduchšia možnosť. Tento postup bol úspešne otestovaný na Ubuntu 17.10 a pravdepodobne funguje aj na 16.04. Nedá sa však vylúčiť výskyt problémov počas používania.

$ mkdir gnupg_tmp
$ cd gnupg_tmp
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/dirmngr_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg-agent_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/scdaemon_2.1.18-8~deb9u1_amd64.deb
$ sudo dpkg -i *
$ cd ..
$ rm -rf gnupg_tmp

Ak chcete inštaláciu zrušiť, musíte vykonať nasledujúce príkazy:

$ sudo dpkg --remove --force-depends gnupg dirmngr gnupg-agent scdaemon
  # (removes manually installed packages)
$ sudo apt-get install gnupg dirmngr gnupg-agent scdaemon
  # (installs the appropriate packages from regular package repositories)