Encriptar e desencriptar arquivos usando chaves públicas e privadas
Gerar Par de Chaves Pública/Privada
Para encriptar arquivos usando uma chave pública, primeiro é preciso gerar uma chave privada, que por sua vez será utilizada para gerar um certificado/chave pública.
A chave privada pode ser gerada com o seguinte comando:
openssl genpkey -aes-256-cbc -algorithm RSA -out chave-privada.pem -pkeyopt rsa_keygen_bits:4096 -pass pass:senha
A opção rsa_keygen_bits indica o tamanho da chave, quanto maior, potencialmente mais segura, mas com rendimentos decrescentes à partir de certo ponto, a opção pass serve para indicar a senha usada para proteger a chave, para que ela não possa ser usada sem autorização para desencriptar os arquivos, e o argumento -out serve para indicar o nome e localização onde deseja salvar a chave.
Com isso já temos a chave privada criada, agora é preciso criar a chave pública, que será utilizada para encriptar os arquivos.
Ela pode ser criada com o seguinte comando:
openssl req -new -x509 -key chave-privada.pem -passin pass:senha -out chave-publica.pem -days 3650
Esse comando irá gerar um certificado, não muito diferente de um certificado utilizado em um website.
A opção -key chave-privada.pem indica qual a chave privada a ser utilizada para gerar a chave pública, nesse caso, a chave que acabamos de criar, novamente, a opção pass vai indicar a senha que foi utilizada para proteger a chave privada, a opção -out chave-publica.pem vai indicar o nome e local onde a chave pública será salva, e a opção -days 3650 vai indicar a validade desse certificado/chave pública, nesse caso, apenas porque sim, ela foi gerada com uma validade de 3650 dias, ou 10 anos.
Entretanto, para facilitar a geração de pares de chaves públicas e privadas, é mais fácil utilizar um script para isso:
#!/bin/bash
openssl genpkey -aes-256-cbc -algorithm RSA -out ${1}-priv.pem -pkeyopt rsa_keygen_bits:4096 -pass pass:$2
openssl req -new -x509 -key ${1}-priv.pem -passin pass:$2 -out ${1}-pub.pem -days 3650 -subj '/C='
Para utilizar esse script é só o executar normalmente e passar como argumento o nome que deseja dar às chaves e a senha que deseja utilizar, e ele irá gerar automaticamente, sem pedir uma senha ou as informações que normalmente são pedidas durante a criação de um certificado/chave pública, e irá criar dois arquivos a chave privada, nomeDaChave-priv.pem, e a chave pública, nomeDaChave-pub.pem, e com isso já temos as nossas chaves que serão utilizadas para encriptar e desencriptar os arquivos.
Encriptar Arquivos
O comando para encriptar um arquivo é o seguinte:
openssl smime -encrypt -binary -aes256 -in nomeDoArquivo -out nomeDoArquivo.enc -outform DER chave-publica.pem
A opção -in nomeDoArquivo vai indicar o arquivo a ser encriptado, e a opção -out nomeDoArquivo.enc o nome do arquivo encriptado (a extenção .enc serve apenas para indicar que o arquivo está encriptado, não é preciso usar essa extensão especificamente), e no final é especificada a chave pública a ser utilizada.
Novamente, podemos criar um script para facilitar esse processo:
#!/bin/bash
openssl smime -encrypt -binary -aes256 -in $1 -out ${1}.enc -outform DER $2
Esse script precisa de dois argumentos, o nome e localização do arquivo a ser encriptado e o nome e localização da chave pública a ser utilizada para a encriptação, e irá gerar automaticamente um arquivo encriptado com o nome completo do arquivo original mais a extensão .enc.
Desencriptar Arquivos
O comando para desencriptar o arquivo é o seguinte:
openssl smime -decrypt -in nomeDoArquivo.enc -binary -inform DEM -inkey chave-privada.pem -out nomeDoArquivo -passin pass:senha
Esse comando é similar ao anterior, é preciso especificar o nome do arquivo que está encriptado, dessa vez a chave privada, o nome do arquivo desencriptado, com a maior diferença sendo a senha para poder acessar a chave privada.
Novamente, é possível criar um script para facilitar o processo:
#!/bin/bash openssl smime -decrypt -in $1 -binary -inform DEM -inkey $3 -out $2 -passin pass:$4
Esse script aceita quatro argumentos, o primeiro é o arquivo encriptado, o segundo é o nome que deseja dar ao arquivo desencriptado, a chave privada, e por último, a senha da chave privada.
E com isso é possível encriptar arquivos de maneira segura.