Em minha prática ainda pequena no campo da segurança da informação, tive que enfrentar alguns problemas de criptografia, ou melhor, criptografia, para os quais dificilmente consegui encontrar respostas claras. Portanto, decidi escrever um pequeno artigo sobre o básico do trabalho com o OpenSSL.
Este artigo discutirá os problemas conhecidos de geração de chaves, bem como o problema menos conhecido da criptografia de tamanhos de arquivos grandes. A certificação está fora de questão aqui.
Vamos começar. De fato, tudo é simples até agora.
Crie uma chave privada com o comando
openssl genrsa -out key.pem -aes-256-cfb -rand /var/log/messages 4096

Aqui:
genrsa - um parâmetro que indica a criação de uma chave pelo algoritmo de criptografia RSA.
out - onde criar a chave.
4096 é o comprimento da chave.
Em geral, isso é suficiente para criar uma chave. Mas a chave privada é melhor para criptografar.
aes-256-cfb - algoritmo e modo de criptografia.
rand / var / log / messages - valores aleatórios de qualquer pasta, é melhor usar logs porque com / dev / random ou / dev / urandom tudo pode ficar firme, eu entendi.
Ao criar uma chave, uma senha será solicitada. A senha é a base de qualquer proteção; portanto, tente bisbilhotá-la. E lembre-se.
Nós temos uma chave. Particular Nunca mostre e esconda a ninguém de acordo com o princípio de Koshchei, o Imortal.
Com base nisso, criaremos um público que possa ser exibido ao público, pelo menos na testa.
openssl rsa -in privatkey.pem -pubout -out publickey.pem

Agora temos um par de chaves. Você pode carregar o público no servidor para conectar-se a ele via ssh usando sua chave privada. Ou para criptografar uma pequena quantidade de dados, por exemplo, um token ou senha, etc.
A tarefa de criptografar um arquivo grande tem uma solução diferente.
Para criptografar uma grande quantidade de dados, usamos, por exemplo, este arquivo pdf com um tamanho de 1,8 Mbytes.

Uma grande quantidade de dados é criptografada com um algoritmo de criptografia simétrica, como o AES. Aqui, usaremos criptografia assimétrica para transmitir uma chave simétrica, com a qual criptografaremos o texto.
Vamos começar.
Crie uma chave de sessão simétrica (única) com uma sequência aleatória de caracteres e grave-a em um arquivo na representação base64.
openssl rand -base64 32 > key.bin
Em seguida, criptografamos o arquivo com esta chave:
openssl enc -aes-256-cfb -salt -in OWASP_Top_10-2017_\(en\).pdf -out OWASP_Top_10-2017_\(en\).pdf.enc -pass file:./key.bin
aes-256-cfb - algoritmo e modo de criptografia. Não vou falar sobre os modos aqui. Este é o melhor.
sal - sal para maior resistência criptográfica.
passar arquivo: ./ key.bin - chave de criptografia.
Em seguida, criptografamos a chave simétrica com nossa chave pública "assimétrica".
openssl rsautl -encrypt -inkey publickey.pem -pubin -in key.bin -out key.bin.enc

Tem um arquivo criptografado e uma chave simétrica. Você pode enviá-lo para seu amigo para descriptografia. Mas enviaremos para nós mesmos, pois isso é dever de casa conosco.
Agora exclua a chave simétrica original! Para que ninguém nunca o encontre.
shred -u key.bin
Na figura abaixo, não está mais lá.

Agora, descriptografamos a chave simétrica com nossa chave assimétrica privada.
openssl rsautl -decrypt -inkey privatkey.pem -in key.bin.enc -out key.bin
E nós, os sortudos, novamente temos uma chave simétrica para descriptografar nosso texto, que ainda está criptografado.
A imagem está novamente abaixo, há uma chave novamente.

Agora, descriptografamos o arquivo criptografado com a cifra de criptografia simétrica por nossa recém criptografada, mas depois descriptografamos usando a cifra de criptografia assimétrica, chave simétrica.
openssl enc -d -aes-256-cfb -in OWASP_Top_10-2017_\(en\).pdf.enc -out OWASP_Top_10-2017_\(en\)decrypt.pdf -pass file:./key.bin
Prova abaixo.

Agora: Por que é tão complicado? Por que você não pode fazer e fazer tudo com criptografia assimétrica?
Tentamos ir direto ao rake;)
Nós temos!
Arquivo e chaves.

Nós criptografamos.
openssl rsautl -encrypt -inkey publickey.pem -pubin -in OWASP_Top_10-2017_\(en\).pdf -out OWASP_Top_10-2017_\(en\).pdf.enc
POW - POW - POOOOOOOOOOOOH. O erro Muitos dados para o tamanho da chave. Para criptografia assimétrica, o tamanho da chave deve ser maior ou igual ao texto sem formatação.
O OpenSSL, como em um acordo com o diabo, deu a você o que você pediu, mas não o que você queria. Verdadeiro, o arquivo criptografado estava vazio.

Mas você pode criptografar um arquivo menor que a chave. Vamos tentar.
Crie um arquivo pequeno.
Por exemplo, eu fiz isso:
echo "hellow world my name is admin is a secret text nobody know it hahahahaahah" > text.txt

Vamos criptografá-lo com nossa chave pública, que todo mundo conhece no mundo!
openssl rsautl -encrypt -inkey publickey.pem -pubin -in text.txt -out text.txt.enc
Como você pode ver na figura abaixo, o arquivo é criptografado. Nada está claro! Quem entende quem você é?

Agora, descriptografamos, tendo excluído anteriormente o arquivo de origem para a pureza do experimento.
openssl rsautl -decrypt -inkey privatkey.pem -in text.txt.enc -out text.txt

Temos um arquivo descriptografado. Tudo está ótimo.
Para transferir todo esse bem criptografado, é melhor codificar o último na base64. Portanto, antes de descriptografar, você deve primeiro decodificar.
Codificado.
openssl enc -base64 -in text.txt.enc -out text.txt.bs64

Decodificado.
openssl enc -base64 -d -in text.txt.bs64 -out text.txt.enc

E, novamente, temos um beleberd que ninguém entende! Se você entende, este documento não é para você!
É assim que a criptografia funciona ao criar chaves e criptografia de dados usando o utilitário OpenSSL como exemplo.
Mais tarde, descreverei os modos de criptografia das cifras simétricas em bloco.