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

(Nitrokey Start - macOS)

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

От съображения за сигурност Германската федерална служба за информационна сигурност (Bundesamt für Sicherheit in der Informationstechnik, BSI) вече не препоръчва ключове RSA с дължина 2048 бита да се използват след 2022 г.. Това означава, че в обозримо бъдеще ще трябва да влязат в употреба по-дълги ключове. Ако приемем, че периодът на използване е пет години, вече е необходимо да се генерират по-дълги ключове. Въпреки това по-дългите ключове 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.

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.

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)