Podpora eliptičnih krivulj (ECC)#

RSA-2048 postaja vse bolj nezanesljiv#

Nemški zvezni urad za informacijsko varnost (Bundesamt für Sicherheit in der Informationstechnik, BSI) iz varnostnih razlogov po letu 2023 ne priporoča več uporabe ključev RSA z dolžino 2048 bitov ` <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf>`__. To pomeni, da bo treba v bližnji prihodnosti začeti uporabljati daljše ključe. Ob predpostavki, da bo obdobje uporabe pet let, je že zdaj treba ustvariti daljše ključe. Vendar pa so daljši ključi RSA s 3072 bitov ali 4096 bitov bistveno počasnejši. Zato nova Nitrokey Storage 2 in Pro 2 (oz. integrirana kartica OpenPGP različice 3.3) podpirata šifriranje s pomočjo kriptografije eliptične krivulje (ECC). Ta metoda velja za enako varno z manjšimi ključi ECC kot z daljšimi ključi RSA in je tudi precej hitrejša.

Osnove kriptografije eliptične krivulje#

V nasprotju z RSA obstaja veliko različnih oblik (tako imenovanih krivulj) kriptografije eliptičnih krivulj. Zlasti NSA je sodelovala pri razvoju krivulj NIST. Tudi če v krivuljah ni dokazov o zakulisnih vratih, lahko uporaba določene krivulje vzbuja dvom o zaupanju. Na srečo novi napravi Nitrokey Storage 2 in Pro 2 podpirata dve vrsti krivulj, in sicer NIST in Brainpool. V nadaljevanju bomo uporabili krivulje Brainpool. Ta članek predstavlja dobro izhodišče za splošno razumevanje kriptografije eliptičnih krivulj.

Sistemske zahteve#

Za ustvarjanje ključev, ki temeljijo na eliptičnih krivuljah, sta potrebna program Nitrokey Storage 2 / Pro 2 in GnuPG različice 2.1.17 ali višje.

Različico kartice OpenPGP podjetja Nitrokey lahko preberete prek gpg2 --card-status:

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

Polje „Različica“ predstavlja različico kartice OpenPGP, integrirane v ključu Nitrokey - v tem primeru je to različica 3.3, ki je potrebna za kriptografijo eliptične krivulje. Kartica OpenPGP različice 2.2 ne podpira ECC.

Nameščeno različico programa GnuPG lahko preverite prek gpg2  --version. Zahtevana je vsaj različica 2.1.16. Najnovejšo različico GnuPG za Windows najdete tudi, najnovejšo različico za MacOS pa tudi. Ustrezna različica GnuPG je vključena v distribucije GNU/Linux Ubuntu (od različice 18.04), Debian (od različice Stretch naprej), Arch Linux, Fedora (od različice 26 naprej) in openSUSE Tumbleweed. Na koncu tega članka so navodila za ročno posodobitev GnuPG v starejših različicah Ubuntuja.

Pomembno

GnuPG 2.0 se še vedno uporablja, vendar je bila podpora zanj leta 2017 ukinjena. Vsi komunikacijski partnerji morajo za šifriranje e-pošte s pomočjo ECC uporabljati GnuPG 2.1 ali novejšo različico, sicer lahko pride do težav z nezdružljivostjo. Zato lahko ECC uporabljate le, če ste prepričani, da boste lahko zaobšli to težavo.

Ustvarjanje ključev v napravi Nitrokey Storage 2 / Pro 2#

Ko so te zahteve izpolnjene, lahko začnete z delom. (Opozorilo: obstoječi ključi bodo pri tem prepisani!) Zdaj imate dve možnosti. Prva možnost je, da ključ ustvarite neposredno v napravi Nitrokey Storage 2 / Pro 2. Prednost te možnosti je, da ključ ne bo nikoli zunaj naprave in ga zato ne bo mogoče prebrati. Druga možnost je uvoz predhodno lokalno ustvarjenega ključa. Prednost v tem primeru je, da lahko varno shranite varnostno kopijo ključa, ki jo lahko obnovite v primeru izgube ključa Nitrokey. V nadaljevanju je opisana samo prva možnost. Če želite ustvariti ključ z varnostno kopijo, lahko dostopate do naslednjih navodil in uporabite te splošne informacije za prenos ključa v ključ Nitrokey.

V programu GnuPG je že na voljo ukaz „generate“, s katerim lahko preprosto ustvarite ključe na napravi. Vendar zaenkrat še ni mogoče neposredno izbrati vrste ključa, zato je treba ključ najprej pripraviti. Za to uporabljamo naslednje ukaze:

> 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

Izberete lahko tudi druge krivulje, kot je opisano v naslednjem razdelku.

Zdaj vnesemo gpg2 --card-edit in vidimo, da je brainpoolP256r1 pod „key attributes“ namesto 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]

Nato ustvarimo ključ.

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.

Ključ Nitrokey zdaj namesto ključev RSA uporablja kriptografijo eliptične krivulje in ga lahko uporabljate kot običajno.

Razpoložljive krivulje#

V zgornjem postopku smo izbrali krivulje Brainpool. Uporabite lahko tudi krivulje NIST. Konfiguracija se izvede na naslednji način:

> 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

Posodobitev GnuPG v Ubuntuju#

Naslednji koraki so potrebni le, če uporabljate različico Ubuntuja, starejšo od 18.04. GnuPG 2.1.18 lahko v tak sistem namestite s spodnjimi ukazi. To vključuje novejše pakete Debian, kar je najlažja možnost. Ta pristop je bil uspešno preizkušen na Ubuntuju 17.10 in verjetno deluje tudi na 16.04. Vendar pa ni mogoče izključiti pojava težav med uporabo.

$ 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

Če želite razveljaviti namestitev, morate izvesti naslednje ukaze:

$ 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)