Podpora eliptických křivek (ECC)#

RSA-2048 se stává stále nezabezpečenějším#

Německý Spolkový úřad pro bezpečnost informací (Bundesamt für Sicherheit in der Informationstechnik, BSI) již z bezpečnostních důvodů nedoporučuje po roce 2022 používat klíče RSA o délce 2048 bitů ` <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf?_blob=publicationFile&v=10>`_. To znamená, že v dohledné budoucnosti bude nutné začít používat delší klíče. Za předpokladu pětiletého období používání je již nyní nutné generovat delší klíče. Delší klíče RSA s 3072 bitů nebo 4096 bitů jsou však výrazně pomalejší. Z tohoto důvodu podporují nová zařízení Nitrokey Storage 2 a Pro 2 (resp. integrovaná karta OpenPGP verze 3.3) šifrování pomocí eliptic-curve cryptography (ECC). Tato metoda je považována za stejně bezpečnou u menších klíčů ECC jako u delších klíčů RSA a je také výrazně rychlejší.

Základy kryptografie eliptických křivek#

Na rozdíl od RSA existuje mnoho různých forem (tzv. křivek) eliptické kryptografie. Pozoruhodné je, že NSA se podílela na vývoji křivek NIST. I když v křivkách nejsou žádné důkazy o zadních vrátkách, může použití určité křivky vyvolat otázku důvěryhodnosti. Naštěstí nová zařízení Nitrokey Storage 2 a Pro 2 podporují dva druhy křivek, a to NIST a Brainpool. V následujícím textu budeme používat křivky Brainpool. Tento článek poskytuje dobrý vstupní bod pro získání obecných znalostí o kryptografii eliptických křivek.

Systémové požadavky#

Pro vytvoření klíčů založených na eliptických křivkách je vyžadováno úložiště Nitrokey Storage 2 / Pro 2 a GnuPG verze 2.1.17 nebo vyšší.

Verzi karty OpenPGP společnosti Nitrokey si můžete přečíst prostřednictvím gpg2 —card-status:

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

Pole „Verze“ představuje verzi karty OpenPGP integrované v klíči Nitrokey - v tomto případě je to verze 3.3, která je potřebná pro kryptografii eliptických křivek. Karta OpenPGP verze 2.2 nepodporuje 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.

Důležité

GnuPG 2.0 se stále používá, ale jeho podpora byla v roce 2017 ukončena. Všichni komunikační partneři musí pro šifrování e-mailů pomocí ECC používat GnuPG 2.1 nebo novější, jinak by mohly vzniknout problémy s nekompatibilitou. ECC byste proto měli používat pouze v případě, že jste si jisti, že se vám podaří tento problém obejít.

Generování klíčů na zařízení Nitrokey Storage 2 / Pro 2#

Po splnění těchto požadavků můžete začít. (Upozornění: stávající klíče budou v průběhu procesu přepsány!) Nyní máte dvě možnosti. První možností je vytvořit klíč přímo v zařízení Nitrokey Storage 2 / Pro 2. Výhodou je, že klíč se nikdy nebude nacházet mimo zařízení a jako takový jej nebude možné přečíst. Druhou možností je importovat dříve lokálně vytvořený klíč. Výhodou v tomto případě je, že si můžete bezpečně uložit zálohu klíče, kterou pak lze obnovit v případě ztráty klíče Nitrokey. Níže je popsána pouze první možnost. Pro vytvoření klíče se zálohou můžete přistoupit k následujícím pokynům a pomocí těchto obecných informací přenést klíč do Nitrokey.

V systému GnuPG již existuje příkaz „generate“, který lze použít ke snadnému vytvoření klíčů v zařízení. Zatím však není možné vybrat typ klíče přímo, takže je třeba klíč nejprve připravit. K tomu slouží následující pří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

Případně lze zvolit jiné křivky, jak je popsáno v následující části.

Nyní zadáme gpg2 --card-edit a uvidíme, že brainpoolP256r1 je v položce „key attributes“ místo 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]

Poté vytvoříme klíč.

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.

Klíč Nitrokey nyní místo klíčů RSA používá kryptografii eliptických křivek a lze jej používat jako obvykle.

Dostupné křivky#

Ve výše uvedeném postupu jsme zvolili křivky Brainpool. Alternativně lze použít křivky NIST. Konfigurace se provádí následujícím způsobem:

> 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

Aktualizace GnuPG v Ubuntu#

Následující kroky jsou nutné pouze v případě, že používáte Ubuntu starší verze než 18.04. Na takový systém můžete nainstalovat GnuPG 2.1.18 pomocí níže uvedených příkazů. Jedná se o novější balíčky Debianu, což je nejjednodušší možnost. Tento postup byl úspěšně vyzkoušen na Ubuntu 17.10 a pravděpodobně funguje i na 16.04. Nelze však vyloučit výskyt problémů během používání.

$ 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

Pokud chcete instalaci vrátit zpět, musíte provést následující pří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)