Elipsinių kreivių (ECC) palaikymas#

(Nitrokey Storage 2 - Windows)

RSA-2048 tampa vis labiau nesaugi#

Saugumo sumetimais Vokietijos federalinė informacijos saugumo tarnyba (Bundesamt für Sicherheit in der Informationstechnik, BSI) po 2023 m. nebepataria naudoti 2048 bitų ilgio RSA raktų ` <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf>`__. Tai reiškia, kad artimiausioje ateityje reikės pradėti naudoti ilgesnius raktus. Darant prielaidą, kad naudojimo laikotarpis yra penkeri metai, jau dabar reikia generuoti ilgesnius raktus. Tačiau ilgesni 3072 bitų arba 4096 bitų RSA raktai yra gerokai lėtesni. Dėl šios priežasties naujieji „Nitrokey Storage 2“ ir „Pro 2“ (arba integruota „OpenPGP Card“ 3.3 versija) palaiko šifravimą naudojant elipsinės kreivės kriptografiją (ECC). Manoma, kad šis metodas yra toks pat saugus naudojant mažesnius ECC raktus, kaip ir ilgesnius RSA raktus, be to, jis yra gerokai greitesnis.

Elipsinės kreivės kriptografijos pagrindai#

Priešingai nei RSA, elipsinės kreivės kriptografija turi daug skirtingų formų (vadinamųjų kreivių). Pažymėtina, kad NSA dalyvavo kuriant NIST kreives. Net jei nėra įrodymų, kad kreivėse yra užpakalinių durų, tam tikros kreivės naudojimas gali kelti pasitikėjimo klausimą. Laimei, naujieji „Nitrokey Storage 2“ ir „Pro 2“ palaiko dviejų rūšių kreives, t. y. NIST ir „Brainpool“. Toliau naudosime „Brainpool“ kreives. Šis straipsnis yra geras pradinis taškas įgyti bendrą supratimą apie elipsinių kreivių kriptografiją.

Sistemos reikalavimai#

Norint sukurti elipsinėmis kreivėmis pagrįstus raktus, reikia turėti „Nitrokey Storage 2“ / „Pro 2“ ir „GnuPG“ versiją 2.1.17 arba naujesnę.

„Nitrokey“ OpenPGP kortelės versiją galite perskaityti naudodami gpg2 --card-status:

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

Lauke „Versija“ nurodoma „Nitrokey“ integruotos „OpenPGP“ kortelės versija - šiuo atveju tai yra 3.3 versija, reikalinga elipsės kreivės kriptografijai. 2.2 „OpenPGP Card“ versija nepalaiko ECC.

Įdiegtą GnuPG versiją galite sužinoti naudodami gpg2  --version. Reikalinga bent 2.1.16 versija. Naujausią „Windows“ skirtą „GnuPG“ versiją rasite kur, o naujausią „MacOS“ skirtą versiją rasite kur. Tinkama „GnuPG“ versija įtraukta į GNU/Linux distribucijas „Ubuntu“ (nuo 18.04), „Debian“ (nuo „Stretch“), „Arch Linux“, „Fedora“ (nuo „Release 26“) ir „openSUSE Tumbleweed“. Šio straipsnio pabaigoje pateikiamos instrukcijos, kaip rankiniu būdu atnaujinti GnuPG senesnėse „Ubuntu“ versijose.

Svarbu

GnuPG 2.0 vis dar naudojama, tačiau 2017 m. jos palaikymas buvo nutrauktas. Visi ryšio partneriai turi naudoti „GnuPG 2.1“ arba naujesnę versiją, skirtą el. laiškų šifravimui naudojant ECC, kitaip gali kilti nesuderinamumo problemų. Todėl ECC turėtumėte naudoti tik tuo atveju, jei esate tikri, kad galėsite apeiti šią problemą.

Raktų generavimas „Nitrokey Storage 2“ / „Pro 2“ įrenginyje#

Kai šie reikalavimai bus įvykdyti, galėsite pradėti darbą. (Įspėjimas: esami raktai bus perrašyti!) Dabar turite dvi galimybes. Pirmoji galimybė - sukurti raktą tiesiogiai „Nitrokey Storage 2“ / „Pro 2“. Privalumas tas, kad raktas niekada nebus už įrenginio ribų, todėl jo niekada nebus galima perskaityti. Antroji galimybė - importuoti anksčiau vietoje sukurtą raktą. Šiuo atveju privalumas tas, kad galite saugiai saugoti atsarginę rakto kopiją, kurią vėliau galima atkurti praradus „Nitrokey“. Toliau aprašoma tik pirmoji galimybė. Norėdami sukurti raktą su atsargine kopija, galite pasinaudoti tomis instrukcijomis ir naudodamiesi šia bendrąja informacija perkelti raktą į „Nitrokey“.

„GnuPG“ programoje jau yra komanda „generate“, kurią galima naudoti norint lengvai sukurti raktus įrenginyje. Tačiau kol kas neįmanoma tiesiogiai pasirinkti rakto tipo, todėl raktą pirmiausia reikia paruošti. Tam naudojamos šios komandos:

> 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

Galima pasirinkti ir kitas kreives, kaip aprašyta kitame skyriuje.

Dabar įvedame gpg2 --card-edit ir matome, kad „brainpoolP256r1“ yra skiltyje „raktų atributai“, o ne 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]

Tada sukuriame raktą.

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.

Dabar „Nitrokey“ rakte vietoj RSA raktų naudojama elipsinės kreivės kriptografija ir jį galima naudoti kaip įprasta.

Galimos kreivės#

Pirmiau aprašytoje procedūroje pasirinkome „Brainpool“ kreives. Galima naudoti ir NIST kreives. Konfigūracija atliekama taip:

> 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

GnuPG atnaujinimas Ubuntu#

Tolesni veiksmai reikalingi tik tuo atveju, jei naudojate senesnę nei 18.04 „Ubuntu“ versiją. Tokioje sistemoje galite įdiegti GnuPG 2.1.18 naudodami toliau pateiktas komandas. Tai susiję su naujesniais „Debian“ paketais, o tai yra paprasčiausias variantas. Šis metodas buvo sėkmingai išbandytas Ubuntu 17.10 versijoje ir tikriausiai veikia ir 16.04 versijoje. Tačiau negalima atmesti problemų atsiradimo naudojimo metu.

$ 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

Jei norite atšaukti diegimą, turite atlikti šias komandas:

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