Obsługa krzywych eliptycznych (ECC)#

RSA-2048 staje się coraz mniej bezpieczny#

Ze względów bezpieczeństwa niemiecki Federalny Urząd Bezpieczeństwa Informacji (Bundesamt für Sicherheit in der Informationstechnik, BSI) nie zaleca już stosowania kluczy RSA o długości 2048 bitów ` po roku 2023 <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf>`__. Oznacza to, że dłuższe klucze będą musiały wejść do użytku w przewidywalnej przyszłości. Zakładając pięcioletni okres użytkowania, już teraz konieczne jest generowanie dłuższych kluczy. Jednak dłuższe klucze RSA z 3072 bit lub 4096 bit są znacznie wolniejsze. Z tego powodu nowy Nitrokey Storage 2 i Pro 2 (resp. zintegrowana karta OpenPGP w wersji 3.3) wspiera szyfrowanie za pomocą ` kryptografii krzywej eliptycznej (ECC) <https://en.wikipedia.org/wiki/Elliptic-curve_cryptography>`__. Ta metoda jest uważana za tak samo bezpieczną przy mniejszych kluczach ECC jak dłuższe klucze RSA, a także jest znacznie szybsza.

Podstawy kryptografii krzywej eliptycznej#

W przeciwieństwie do RSA, istnieje wiele różnych form (tzw. krzywych) kryptografii eliptyczno-krzywej. W szczególności, 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 określonej krzywej może budzić wątpliwości co do zaufania. Na szczęście nowe Nitrokey Storage 2 i Pro 2 wspierają dwa rodzaje krzywych, mianowicie NIST i Brainpool. W dalszej części artykułu będziemy używać krzywych Brainpool. Ten artykuł stanowi dobry punkt wyjścia do zdobycia 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.

Możesz dowiedzieć się o zainstalowanej wersji GnuPG poprzez gpg2  --version. Wymagana jest co najmniej wersja 2.1.16. Najnowszą wersję GnuPG dla Windows można znaleźć ` tutaj <https://www.gpg4win.org/>`__, a najnowszą wersję dla MacOS można znaleźć ` tutaj <https://gpgtools.org/>`__. Odpowiednia wersja GnuPG znajduje się w dystrybucjach GNU/Linux: Ubuntu (od 18.04), Debian (od Stretch), Arch Linux, Fedora (od Release 26) i openSUSE Tumbleweed. Na końcu artykułu znajduje się instrukcja jak ręcznie zaktualizować GnuPG na starszych wersjach Ubuntu.

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#

Gdy te wymagania zostaną spełnione, możesz zacząć działać. (Ostrzeżenie: istniejące klucze zostaną nadpisane w procesie!) Masz teraz dwie opcje. Pierwsza opcja to stworzenie 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ł być odczytany. Drugą opcją jest import wcześniej wygenerowanego lokalnie klucza. Zaletą w tym przypadku jest to, że można bezpiecznie przechowywać kopię zapasową klucza, która może być następnie przywrócona 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ć tej ` informacji ogólnej <https://wiki.fsfe.org/TechDocs/CardHowtos/CardWithSubkeysUsingBackups>`__, aby przenieść klucz na 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)