Como criptografar mensagens / texto com RSA e OpenSSL?

29

Eu tenho a chave pública de Alice. Quero enviar para Alice uma mensagem criptografada RSA. Como posso fazer isso usando o opensslcomando?

A mensagem é:

Oi Alice! Por favor, traga malacpörkölt para o jantar!

LanceBaynes
fonte

Respostas:

36

No manual openssl ( opensslpágina de manual ), pesquise RSAe você verá que o comando para criptografia RSA é rsautl. Em seguida, leia a rsautlpágina do manual para ver sua sintaxe.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

O esquema de preenchimento padrão é o PKCS # 1 v1.5 original (ainda usado em muitos procotols); O openssl também suporta OAEP (agora recomendado) e criptografia bruta (útil apenas em circunstâncias especiais).

Observe que usar o openssl diretamente é principalmente um exercício. Na prática, você usaria uma ferramenta como gpg (que usa RSA, mas não diretamente para criptografar a mensagem).

Gilles 'SO- parar de ser mau'
fonte
Qual é o problema com o uso openssl?
Bratchley
2
@Bratchley A opensslferramenta de linha de comando é uma mistura de diferentes comandos. Alguns, principalmente os que manipulam certificados, podem ser úteis, mas são difíceis de usar corretamente, porque sua sintaxe e parâmetros são peculiares. Alguns, como rsautl, são bons, mas não fornecem funcionalidade útil, apenas expõem primitivas criptográficas brutas - por exemplo, a criptografia RSA é usada apenas para criptografar uma chave simétrica para criptografia híbrida. Alguns, como enc, são muito difíceis de usar com segurança e o mundo ficaria melhor se não existisse.
Gilles 'SO- stop be evil'
Ótima resposta. Eu adicionado preenchimento com este -oaep bandeira Então, decrypt, especifique o mesmo ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet
24

Primeiro, se você quer apenas uma boa criptografia, deve consultar o GnuPG . Mas se você está experimentando e quer apenas aprender como funciona, você precisa entender o que é RSA . O RSA não foi projetado para criptografar nenhuma sequência arbitrária, é um algoritmo que criptografa um número inteiro. Especificamente, um número inteiro de 0 a n-1, em que n é o valor do módulo da chave pública. Quando você fala sobre uma chave RSA de 1024 bits, isso significa que são necessários 1024 bits para armazenar o módulo em binário. Esse é um dos motivos pelos quais o RSA é usado em combinação com uma cifra de chave simétrica como DES ou AES. Você pode gerar uma chave aleatória de 256 bits para o AES e criptografar essa chave com uma chave pública RSA de 1024 bits. Qualquer pessoa que acesse a chave privada pode extrair a chave simétrica e decodificar a mensagem com o AES. O padrão completo para RSA é chamado PKCS # 1

Além disso, DES e AES são cifras de bloco. Eles só criptografam dados em blocos de um tamanho específico. O DES usa blocos de 64 bits e o AES usa blocos de 128 bits. Para criptografar mais de um bloco, você deve usar um Modo de Operação como CBC ou CTR. Esses modos especificam como criptografar um fluxo de bits usando uma cifra em modo de bloco.

Por fim, é importante verificar os dados que você está recebendo. Embora um invasor não consiga ler dados em trânsito, ele poderá inverter bits sem detecção, se nenhuma integridade ou autenticidade for aplicada ao fluxo de dados. Um invasor pode adivinhar com facilidade que uma conexão SSL à porta 443 é provavelmente uma solicitação de página da Web começando com GET /ele e ele pode mudar a mudança de bits para PUT /sem interferir no restante da criptografia. Uma abordagem simples à integridade é anexar uma soma MD5 ou SHA-1 ao final, mas isso apenas fornece integridade dos dados, não autenticidade dos dados. Qualquer pessoa com conhecimento completo do fluxo de dados pode gerar uma soma correta, uma abordagem mais segura é usar um hash com chave como o HMAC que requer conhecimento de uma chave secreta para gerar, fornecendo assim autenticidade dos dados, além de integridade.

penguin359
fonte
2
Este é realmente bom
MKO
5

Abaixo, observe que você pode especificar qualquer algoritmo que desejar, seja o listado ou o RSA (embora eu não saiba o nome exato usado para OpenSSL pelo RSA)

use "openssl enc-help" para obter uma lista das cifras suportadas no seu sistema e passe isso como argumento. por exemplo, "-eses256"

Nota no meu sistema, não tenho RSA em minhas opções - pelo menos com esse nome.


Como criptografar uma mensagem S / MIME?

Digamos que alguém lhe envie seu certificado público e solicite que você criptografe alguma mensagem para ela. Você salvou o certificado dela como her-cert.pem. Você salvou sua resposta como my-message.txt.

Para obter a criptografia RC2-40 padrão, embora bastante fraca, basta informar ao openssl onde a mensagem e o certificado estão localizados.

openssl smime her-cert.pem -encrypt -em minha-mensagem.txt

Se você tiver certeza de que seu correspondente remoto possui um kit de ferramentas SSL robusto, poderá especificar um algoritmo de criptografia mais forte, como o DES triplo:

openssl smime her-cert.pem -encrypt -des3 -em minha-mensagem.txt

Por padrão, a mensagem criptografada, incluindo os cabeçalhos de email, é enviada para a saída padrão. Use a opção -out ou seu shell para redirecioná-lo para um arquivo. Ou, muito mais complicado, canalize a saída diretamente para o sendmail.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

Como assino uma mensagem S / MIME?

Se você não precisa criptografar a mensagem inteira, mas deseja assiná-la para que seu destinatário possa ter certeza da integridade da mensagem, a receita é semelhante à da criptografia. A principal diferença é que você precisa ter sua própria chave e certificado, pois não pode assinar nada com o certificado do destinatário.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(em http://www.madboa.com/geek/openssl/ )

(er ... todas essas barras invertidas - essas linhas deveriam ter escapado de novas linhas. não sei o que está acontecendo, pois é exibido bem na minha caixa de edição aqui!

draeath
fonte
1
Você precisa colocar quatro espaços no início de cada linha para preservar as novas linhas. Mudei o primeiro bloco para mostrar como. Você pode consertar o segundo?
28611 Mikel
1
Você não encontrou o RSA openssl encporque encé apenas para criptografia simétrica. Sim, as opções do openssl não são muito bem organizadas. Os algoritmos assimétricos têm seus próprios comandos: rsa/ dsa/ dhpara manipular chaves, rsautl/ dsautlpara criptografar / descriptografar / verificar / assinar e genrsa/ gendsa/ gendhpara gerar chaves.
Gilles 'SO- stop be evil'