Поддръжка на елиптични криви (ECC)

RSA-2048 става все по-несигурен

От съображения за сигурност Германската федерална служба за информационна сигурност (Bundesamt für Sicherheit in der Informationstechnik, BSI) вече не препоръчва ключове RSA с дължина 2048 бита да се използват след 2023 г.. Това означава, че в обозримо бъдеще ще трябва да започнат да се използват по-дълги ключове. Ако приемем, че периодът на използване е пет години, вече е необходимо да се генерират по-дълги ключове. Въпреки това по-дългите ключове RSA с 3072 бита или 4096 бита са значително по-бавни. Поради тази причина новите Nitrokey Storage 2 и Pro 2 (респ. интегрираната OpenPGP карта версия 3.3) поддържат криптиране чрез криптография с елиптична крива (ECC). Счита се, че този метод е също толкова сигурен с по-малки ключове ECC, колкото и с по-дълги ключове RSA, а освен това е значително по-бърз.

Основи на криптографията с елиптична крива

За разлика от RSA съществуват много различни форми (т.нар. криви) на криптографията с елиптични криви. Забележително е, че NSA е участвала в разработването на кривите на NIST. Дори и да няма доказателства за наличие на „задни вратички“ в кривите, използването на определена крива може да постави под въпрос доверието. За щастие новите Nitrokey Storage 2 и Pro 2 поддържат два вида криви, а именно NIST и Brainpool. По-нататък ще използваме криви Brainpool. Тази статия предоставя добра отправна точка за придобиване на обща представа за криптографията с елиптични криви.

Изисквания

За създаване на ключове, базирани на елиптични криви, са необходими Nitrokey Storage 2 / Pro 2 и GnuPG версия 2.1.17 или по-висока.

Можете да прочетете версията на OpenPGP картата на Nitrokey чрез gpg2 --card-status:

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

Полето „Версия“ представлява версията на картата OpenPGP, интегрирана в Nitrokey - в този случай тя е 3.3, както е необходимо за криптографията с елиптична крива. Версия 2.2 на OpenPGP Card не поддържа ECC.

Можете да научите за инсталираната версия на GnuPG чрез gpg2  --version. Изисква се поне версия 2.1.16. Най-новата версия на GnuPG за Windows може да бъде намерена тук, а най-новата версия за MacOS може да бъде намерена тук. Подходяща версия на GnuPG е включена в дистрибуциите на GNU/Linux Ubuntu (от 18.04), Debian (от Stretch нататък), Arch Linux, Fedora (от Release 26 нататък) и openSUSE Tumbleweed. В края на тази статия са дадени инструкции как ръчно да актуализирате GnuPG в по-старите версии на Ubuntu.

Important

GnuPG 2.0 все още се използва, но поддръжката му беше прекратена през 2017 г. Всички комуникационни партньори трябва да използват GnuPG 2.1 или по-нова версия за криптиране на имейли чрез ECC, в противен случай може да възникнат проблеми с несъвместимостта. Затова трябва да използвате ECC само ако сте сигурни, че ще можете да заобиколите този проблем.

Генериране на ключове в Nitrokey Storage 2 / Pro 2

След като тези изисквания са изпълнени, можете да започнете работа. (Предупреждение: съществуващите ключове ще бъдат презаписани в процеса!) Сега имате две възможности. Първият вариант е да създадете ключа директно в устройството Nitrokey Storage 2 / Pro 2. Предимството тук е, че ключът никога няма да се намира извън устройството и като такъв не може да бъде прочетен. Втората възможност е да импортирате предварително генериран локален ключ. Предимството в този случай е, че можете да съхранявате сигурно резервно копие на ключа, което след това може да бъде възстановено в случай на загуба на Nitrokey. По-долу е описан само първият вариант. За да създадете ключ с резервно копие, можете да получите достъп до следващите инструкции и да използвате тази обща информация, за да прехвърлите ключа в Nitrokey.

В GnuPG вече има команда „generate“, която може да се използва за лесно създаване на ключове на устройството. Все още обаче не е възможно да се избере директно типът на ключа, така че ключът трябва първо да се подготви. За тази цел използваме следните команди:

> 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

Алтернативно могат да бъдат избрани други криви, както е описано в следващия раздел.

Сега въвеждаме gpg2 --card-edit и виждаме, че brainpoolP256r1 е под „ключови атрибути“ вместо 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]

След това създаваме ключа.

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 вече използва криптография с елиптична крива вместо RSA ключове и може да се използва както обикновено.

Налични криви

В горната процедура избрахме кривите на Brainpool. Алтернативно могат да се използват кривите на NIST. Конфигурацията се извършва по следния начин:

> 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 в Ubuntu

Следващите стъпки са необходими само ако използвате версия на Ubuntu, по-стара от 18.04. Можете да инсталирате GnuPG 2.1.18 на такава система с командите по-долу. Това включва по-нови пакети на Debian, което е най-лесният вариант. Този подход е тестван успешно на Ubuntu 17.10 и вероятно работи и на 16.04. Въпреки това не може да се изключи появата на проблеми по време на използването.

$ 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

В случай че искате да върнете инсталацията, трябва да изпълните следните команди:

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