Eu tenho a chave pública de Alice. Quero enviar para Alice uma mensagem criptografada RSA. Como posso fazer isso usando o openssl
comando?
A mensagem é:
Oi Alice! Por favor, traga malacpörkölt para o jantar!
fonte
Eu tenho a chave pública de Alice. Quero enviar para Alice uma mensagem criptografada RSA. Como posso fazer isso usando o openssl
comando?
A mensagem é:
Oi Alice! Por favor, traga malacpörkölt para o jantar!
No manual openssl ( openssl
página de manual ), pesquise RSA
e você verá que o comando para criptografia RSA é rsautl
. Em seguida, leia a rsautl
pá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).
openssl
?openssl
ferramenta 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, comorsautl
, 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, comoenc
, são muito difíceis de usar com segurança e o mundo ficaria melhor se não existisse.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 paraPUT /
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.fonte
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.
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:
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.
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.
(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!
fonte
openssl enc
porqueenc
é 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
/dh
para manipular chaves,rsautl
/dsautl
para criptografar / descriptografar / verificar / assinar egenrsa
/gendsa
/gendh
para gerar chaves.