Поддержка эллиптических кривых (ECC)#

RSA-2048 становится все более небезопасным#

По соображениям безопасности Федеральное управление по информационной безопасности Германии (Bundesamt für Sicherheit in der Informationstechnik, BSI) больше не рекомендует использовать ключи RSA длиной 2048 бит после 2022 года. Это означает, что в обозримом будущем придется использовать более длинные ключи. Если предположить, что период использования составит пять лет, то уже сейчас необходимо генерировать более длинные ключи. Однако более длинные ключи RSA с длиной 3072 или 4096 бит работают значительно медленнее. По этой причине новые Nitrokey Storage 2 и Pro 2 (в связи с интегрированной OpenPGP Card версии 3.3) поддерживают шифрование с помощью криптографии с эллиптическими кривыми (ECC). Этот метод считается таким же безопасным при использовании меньших ключей ECC, как и длинных ключей RSA, а также значительно более быстрым.

Основы криптографии с эллиптическими кривыми#

В отличие от RSA, существует множество различных форм (так называемых кривых) криптографии с эллиптическими кривыми. Примечательно, что АНБ участвовало в разработке кривых NIST. Даже если нет никаких доказательств наличия «черных ходов» в кривых, использование определенной кривой может поставить вопрос о доверии. К счастью, новые Nitrokey Storage 2 и Pro 2 поддерживают два вида кривых, а именно NIST и Brainpool. Далее мы будем использовать кривые Brainpool. Эта статья является хорошей отправной точкой для получения общего представления о криптографии на эллиптических кривых.

Системные требования#

Для создания ключей на основе эллиптических кривых требуется Nitrokey Storage 2 / Pro 2 и GnuPG версии 2.1.17 или выше.

Вы можете прочитать версию Nitrokey OpenPGP Card через gpg2 —card-status:

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

Поле „Version“ представляет собой версию OpenPGP Card, встроенную в Nitrokey - в данном случае это 3.3, что необходимо для криптографии с эллиптическими кривыми. OpenPGP Card версии 2.2 не поддерживает 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.

Важно

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)