Suporte a Curvas Elípticas (ECC)#

RSA-2048 Torna-se cada vez mais inseguro#

Por razões de segurança, o Bundesamt für Sicherheit in der Informationstechnik (BSI) já não recomenda chaves RSA com um comprimento de 2048 bit ` para serem usadas depois de 2023 <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf>`__. Isto significa que as chaves mais longas terão de entrar em uso num futuro previsível. Assumindo um período de utilização de cinco anos, já é necessário para gerar chaves mais longas. No entanto, chaves RSA mais longas com 3072 bit ou 4096 bit são significativamente mais lentas. Por este motivo, o novo Nitrokey Storage 2 e Pro 2 (resp. o OpenPGP Card versão 3.3 integrado) suporta encriptação por meio de ` criptografia de curva celíaca (ECC) <https://en.wikipedia.org/wiki/Elliptic-curve_cryptography>`__. Este método é considerado tão seguro com chaves ECC mais pequenas como com chaves RSA mais longas e é também consideravelmente mais rápido.

Noções básicas de Criptografia Elíptica-Curva#

Em contraste com a RSA, existem muitas formas diferentes (as chamadas curvas) de criptografia elíptica-curva. Notavelmente, o NSA esteve envolvido no desenvolvimento das curvas NIST. Mesmo que não haja evidência de portas traseiras nas curvas, a utilização de uma determinada curva pode colocar uma questão de confiança. Felizmente, o novo Nitrokey Storage 2 e Pro 2 suportam dois tipos de curvas, nomeadamente NIST e Brainpool. No que se segue, utilizaremos as curvas Brainpool. ` Este artigo <https://arstechnica.com/information-technology/2013/10/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/>`__ proporciona um bom ponto de entrada para a obtenção de uma compreensão geral da criptografia elíptica-curva.

Requisitos de sistema#

Para criar chaves baseadas em curvas elípticas é necessário um Nitrokey Storage 2 / Pro 2 e GnuPG versão 2.1.17 ou superior.

Pode ler a versão OpenPGP Card da Nitrokey através de gpg2 --card-status`:

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

O campo “Versão” representa a versão da placa OpenPGP integrada na Nitrokey - neste caso é a 3.3 conforme necessário para a criptografia de curva elíptica. A versão 2.2 do OpenPGP Card não suporta o ECC.

Pode conhecer a versão instalada do GnuPG através de gpg2  --version`. Pelo menos a versão 2.1.16 é necessária. A mais recente versão GnuPG para Windows pode ser encontrada aqui e a mais recente versão para MacOS pode ser encontrada aqui. Uma versão adequada do GnuPG está incluída nas distribuições GNU/Linux Ubuntu (desde 18.04), Debian (a partir de Stretch), Arch Linux, Fedora (a partir da versão 26) e openSUSE Tumbleweed. No final destes artigos encontram-se instruções de como actualizar manualmente o GnuPG em versões antigas do Ubuntu.

Importante

O GnuPG 2.0 ainda está sendo usado, mas o suporte para ele foi descontinuado em 2017. Todos os parceiros de comunicação devem usar o GnuPG 2.1 ou mais recente para criptografia de e-mail por meio do ECC, caso contrário, podem surgir problemas de incompatibilidade. Portanto, você só deve usar o ECC se você tiver certeza de que será capaz de contornar este problema.

Geração de Chaves no Armazenamento Nitrokey 2 / Pro 2#

Uma vez preenchidos estes requisitos, pode começar a trabalhar. (Atenção: as chaves existentes serão sobreescritas no processo!) Tem agora duas opções. A primeira opção é criar a chave directamente no Armazém Nitrokey 2 / Pro 2. O benefício aqui é que a chave nunca estará fora do dispositivo e como tal nunca poderá ser lida. A segunda opção é importar uma chave previamente gerada localmente. A vantagem neste caso é que se pode armazenar em segurança uma cópia de segurança da chave, que pode então ser restaurada em caso de perda da Nitrokey. Apenas a primeira opção é descrita abaixo. Para criar uma chave com backup, pode aceder a ` as seguintes instruções <https://www.gniibe.org/memo/software/gpg/keygen-25519.html>`__ e utilizar isto ` informação geral <https://wiki.fsfe.org/TechDocs/CardHowtos/CardWithSubkeysUsingBackups>>x id=»825»></x>__ para transferir a chave para a Nitrokey.

Dentro do GnuPG já existe um comando «gerar», que pode ser usado para criar facilmente chaves no dispositivo. No entanto, ainda não é possível selecionar diretamente o tipo de chave, por isso a chave deve ser preparada primeiro. Para isso, usamos os seguintes comandos:

> 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

Alternativamente, outras curvas podem ser selecionadas, como descrito na próxima seção.

Agora entramos gpg2 --card-edit e vemos que o brainpoolP256r1 está sob «atributos chave» em vez de 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]

Depois criamos a chave.

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.

A Nitrokey incorpora agora criptografia de curva elíptica em vez das chaves RSA e pode ser usada como de costume.

Curvas Disponíveis#

No procedimento acima escolhemos as curvas de Brainpool. Alternativamente, as curvas NIST podem ser usadas. A configuração é feita da seguinte forma:

> 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

Atualização do GnuPG no Ubuntu#

Os passos seguintes só são necessários se você estiver executando uma versão do Ubuntu mais antiga que 18.04. Você pode instalar o GnuPG 2.1.18 em tal sistema com os comandos abaixo. Isto envolve pacotes Debian mais recentes, o que é a opção mais fácil. Esta abordagem tem sido testada com sucesso no Ubuntu 17.10 e provavelmente funciona também no 16.04. No entanto, a ocorrência de problemas durante a utilização não pode ser excluída.

$ 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

Caso você queira desfazer a instalação, você tem que executar os seguintes comandos:

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