Obsługa krzywych eliptycznych (ECC)#

(Nitrokey Pro 2 - macOS)

RSA-2048 staje się coraz mniej bezpieczny#

Ze względów bezpieczeństwa niemiecki Federalny Urząd Bezpieczeństwa Informatycznego (Bundesamt für Sicherheit in der Informationstechnik, BSI) nie zaleca już stosowania kluczy RSA o długości 2048 bitów ` po roku 2022 <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf?_blob=publicationFile&v=10>`_. Oznacza to, że w przewidywalnej przyszłości konieczne będzie stosowanie dłuższych kluczy. Zakładając pięcioletni okres użytkowania, już teraz konieczne jest generowanie dłuższych kluczy. Jednak dłuższe klucze RSA o długości 3072 bitów lub 4096 bitów są znacznie wolniejsze. Z tego powodu nowe Nitrokey Storage 2 i Pro 2 (resp. zintegrowana karta OpenPGP w wersji 3.3) wspierają szyfrowanie za pomocą kryptografii krzywej eliptycznej (ECC). Metoda ta jest uważana za równie bezpieczną przy mniejszych kluczach ECC, jak i dłuższych kluczach RSA, a ponadto jest znacznie szybsza.

Podstawy kryptografii krzywej eliptycznej#

W przeciwieństwie do RSA, istnieje wiele różnych form (tzw. krzywych) kryptografii krzywych eliptycznych. Warto zauważyć, że NSA była zaangażowana w rozwój krzywych NIST. Nawet jeśli nie ma dowodów na istnienie tylnych furtek w krzywych, używanie danej krzywej może budzić wątpliwości co do zaufania. Na szczęście nowe Nitrokey Storage 2 i Pro 2 obsługują dwa rodzaje krzywych, mianowicie NIST i Brainpool. W dalszej części będziemy używać krzywych Brainpool. ` Ten artykuł <https://arstechnica.com/information-technology/2013/10/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/>`_ stanowi dobry punkt wyjścia do uzyskania ogólnego zrozumienia kryptografii krzywych eliptycznych.

Wymagania systemowe#

Do utworzenia kluczy opartych na krzywych eliptycznych wymagany jest Nitrokey Storage 2 / Pro 2 oraz GnuPG w wersji 2.1.17 lub wyższej.

Wersję karty OpenPGP firmy Nitrokey można odczytać za pomocą gpg2 --card-status:

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

Pole „Wersja” przedstawia wersję karty OpenPGP zintegrowanej z Nitrokey - w tym przypadku jest to wersja 3.3, która jest wymagana dla kryptografii krzywej eliptycznej. Karta OpenPGP w wersji 2.2 nie obsługuje ECC.

You can learn about the installed version of GnuPG via gpg2  --version. At least version 2.1.16 is required. The newest GnuPG version for Windows can be found here and the newest version for MacOS can be found here. A suitable version of GnuPG is included in the GNU/Linux distributions Ubuntu (since 18.04), Debian (from Stretch onwards), Arch Linux, Fedora (from Release 26 onwards) and openSUSE Tumbleweed. At the end of this articles are instructions how to manually update GnuPG on older Ubuntu versions.

Ważne

GnuPG 2.0 jest nadal używany, ale wsparcie dla niego zostało zakończone w 2017 roku. Wszyscy partnerzy komunikacyjni muszą używać GnuPG 2.1 lub nowszego do szyfrowania wiadomości e-mail za pomocą ECC, w przeciwnym razie mogą pojawić się problemy z niekompatybilnością. Dlatego powinieneś używać ECC tylko wtedy, gdy jesteś pewien, że będziesz w stanie obejść ten problem.

Generowanie kluczy na Nitrokey Storage 2 / Pro 2#

Po spełnieniu tych wymagań można przystąpić do pracy. (Uwaga: istniejące klucze zostaną w tym procesie nadpisane!) Masz teraz dwie opcje. Pierwszą opcją jest utworzenie klucza bezpośrednio na Nitrokey Storage 2 / Pro 2. Zaletą tego rozwiązania jest to, że klucz nigdy nie znajdzie się poza urządzeniem i jako taki nie będzie mógł zostać odczytany. Drugą opcją jest zaimportowanie wcześniej wygenerowanego lokalnie klucza. Zaletą w tym przypadku jest bezpieczne przechowywanie kopii zapasowej klucza, którą można przywrócić w przypadku utraty Nitrokey. Poniżej opisana jest tylko pierwsza opcja. Aby utworzyć klucz z kopią zapasową, możesz uzyskać dostęp do ` następujących instrukcji <https://www.gniibe.org/memo/software/gpg/keygen-25519.html>`_ i użyć tych informacji ogólnych do przeniesienia klucza do Nitrokey.

W GnuPG istnieje już polecenie „generate”, które może być użyte do łatwego tworzenia kluczy na urządzeniu. Jednak jak na razie nie ma możliwości bezpośredniego wyboru typu klucza, więc klucz musi być najpierw przygotowany. Używamy do tego następujących poleceń:

> 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

Alternatywnie można wybrać inne krzywe, jak opisano w następnej sekcji.

Teraz wpisujemy gpg2 --card-edit i widzimy, że brainpoolP256r1 jest pod „atrybutami klucza” zamiast 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]

Następnie tworzymy klucz.

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.

Nitrokey zawiera teraz kryptografię krzywej eliptycznej zamiast kluczy RSA i może być używany jak zwykle.

Dostępne łuki#

W powyższej procedurze wybraliśmy krzywe Brainpool. Alternatywnie można użyć krzywych NIST. Konfigurację przeprowadza się w następujący sposób:

> 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

Aktualizacja GnuPG na Ubuntu#

Poniższe kroki są konieczne tylko wtedy, gdy używasz Ubuntu w wersji starszej niż 18.04. Na takim systemie można zainstalować GnuPG 2.1.18 za pomocą poniższych poleceń. Wiąże się to z nowszymi pakietami Debiana, co jest najłatwiejszą opcją. To podejście zostało przetestowane z powodzeniem na Ubuntu 17.10 i prawdopodobnie działa również na 16.04. Nie można jednak wykluczyć wystąpienia problemów podczas użytkowania.

$ 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

W przypadku, gdy chcesz cofnąć instalację, musisz wykonać następujące polecenia:

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