Como criptografar mensagens / texto com o RSA & OpenSSL?

25

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

A mensagem é:

Hi Alice! Please bring malacpörkölt for dinner!

    
por LanceBaynes 29.04.2011 / 00:36

3 respostas

31

No manual do openssl ( openssl man page), pesquise RSA e você ' Veremos que o comando para criptografia RSA é rsautl . Em seguida, leia a página rsautl man para ver sua sintaxe.

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

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

Note 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).

    
por 29.04.2011 / 01:21
22

Primeiro, se você quer apenas uma boa criptografia, deve olhar para GnuPG . Mas se você está experimentando e quer aprender como funciona, precisa entender o que é RSA . O RSA não foi projetado para criptografar nenhuma string arbitrária, é um algoritmo que criptografa um inteiro. Especificamente, um inteiro de 0 a n-1, onde n é o valor do módulo da chave pública. Quando você fala sobre uma chave RSA que é 1024 bits, isso significa que leva 1024 bits para armazenar o módulo em binário. Esta é uma das razões, 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. Então qualquer um que acesse a chave privada pode extrair a chave simétrica e decodificar a mensagem com AES. O padrão completo para RSA é chamado de PKCS # 1

Além disso, DES e AES são cifras de bloco. Eles só criptografam dados em um bloco de 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 no modo de bloco.

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

    
por 29.04.2011 / 01:26
4

No abaixo, note que você pode especificar qualquer algoritmo que você quer, seja os listados ou RSA (embora eu não saiba o nome exato usado pelo RSA pelo OpenSSL)

use "openssl enc-help" para obter uma lista de cifras suportadas em seu sistema, e passe isso como um argumento. por exemplo, "-aes256"

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

Como criptografo uma mensagem S / MIME?

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

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

openssl smime her-cert.pem -encrypt -in my-message.txt

Se você tem certeza de que seu correspondente remoto tem um kit de ferramentas SSL robusto, é possível especificar um algoritmo de criptografia mais strong, como o DES triplo:

openssl smime her-cert.pem -encrypt -des3 -in my-message.txt

Por padrão, a mensagem criptografada, incluindo os cabeçalhos de e-mail, é 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 faço para assinar uma mensagem S / MIME?

Se você não precisa criptografar toda a mensagem, 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]

(de link )

(er ... todas essas barras invertidas - elas devem ter escapadas de linhas novas. Não tenho certeza do que está acontecendo, pois elas são exibidas na minha caixa de edição aqui!

    
por 29.04.2011 / 01:11