Arquivo

Posts Tagged ‘chave pública’

Criptografia Assimétrica com OpenSSL

O OpenSSL é um projeto open source que ajuda a aumentar a segurança na comunicação entre aplicações e garante a autenticidade da identidade de uma das partes comunicantes. Em outro artigo, mostrei como gerar um arquivo p7b. Nesse artigo, vou mostrar como utilizar o OpenSSL para trabalhar com chaves públicas e privadas (criptografia assimétrica).

Criação das Chaves

Vamos utilizar o algoritmo RSA para gerar a chave privada:

$openssl genrsa -out privkey.kp 2048

Esse comando produziu um arquivo chamado privkey.kp cujo conteúdo é:

—–BEGIN RSA PRIVATE KEY—–
MIIEpQIBAAKCAQEA0s2xwy0/awWsYBSTWV+C4MwgBgGw3lj6WiLiXD6oRdhVgEFQ
2PjUJPF0r90McWXmFvVyTlQIFqATtsI7XeMxaI8mecHZpaZWkuWwn9P5Y/oaEfnd
SwzdpugY1yveho39PBKBipuypcPhPEee/fHTeoQiua4FXiCUWhKMSqGBWN830sOw
fZwzKVw5N0JS0HFjiB/PO8TTy5hJ2p+Wb6S2uUwQdo8fwvvD1hNeJiJVH22s+fDh
mG9PDMpOrzXpRkiC9YzzXTRZwOn6oRtXTKIF5LdvpxwKSi641Yl2yCnUW7A7V9zY
UVIOh4m9blP+XGJvW22+l3dAd7gfyXyxZB0v9QIDAQABAoIBADhG4aYRdlTD9vjP
hWbesLoCxKnV2boCVxOpLHUj5RiAYJMU3NiP1VLngxdQE/pSEdMfQ5zVojMoGRs5
T1AJTy9yx/rJXalzdrlQyI5isLmYE02pPwLCNIpSfA81jvqs/WYEKsEuP8sxN/g3
xqJU5PhYPk0DwDsYx4IkYX+rDjUDJmKc6A35LRlCFrBOn46ABW7s5SZYm2dvJqY8
5DJYK1j/jmpO52Ua0nnL/jVxXtwZA/2Y83D34XxHVEaIekG9uKGL0xdoovNEfblB
by2b4A6TT3fkhwlZskAE/b4nX/udWvvkPtVWwTXqZqutdBGKy8MY7hggog4lmt0C
e1CkCQECgYEA8wE2vL2SjQfmDBHM9ipeChWGiObNPq2jIbcrzPAZz5PQJRR892oU
rzgiVwYam4bzj9WYvKVsOLAud3cMiDzmFJ+0MJSbj+vEv5zxuzCqLuURbde8eGth
NMf+I3vkhBp6Vp+T9mnnKDIkbqH3zwvu7Q6z2Rkjidjn0YEbpbSoNMkCgYEA3hOj
gTpXrg4K1l+Opdm0AkHAqaoZYshaUhUepvpjBVRheToTxX5x6g7sHIZ1saxC3Mgm
Q3j95qjMwwAFyF0ySVtIexkxgtcGyBnUgRVeTCKZRtNpawn8SQgruVL8LmHKdQfk
wqCEcGP5jL+oZDzrab+5D0RJQ3Stwnr8X5GAE80CgYEA35NJUkO0ty8COC6UfhQi
63I8km6PfdBx285UbTym8rXTdpowE8608zVZWunRxzBVnQtveHlWZZ2rUtzkWeB1
65m4Rk4kBjlsjsMOISS4H2dALuijjcN17wLmTq1pZSWbU2GE190+AVyI6oT4o7Ue
AVtamy6m5Of8+WOpFT9u1wkCgYEA3A3Bus/BCivH+Vx+0UDD6miVLIns1cGKHkPn
N7ZsYF+YprMx3ETLRA69UBa8kO4M4xFBOSKvFNy26ZMgJ8aRibb2P2Rbdzby9V0D
AVXXNsIh99iNYQ9n+kYqbV0ZniwwnX7Q4zqDgYrPQPS5O3pSG1trWQFlR35an5eW
dGyM6RECgYEA0NoXZz+u6kpcqvB2cH/8g3HmZ8Q8qCQnnn4SZM19XuyUQUkXv0wa
g+nqhWDNFygTcSiWbw3lk/07QRVXvuxOJbGr9CuLA+F0d06wcqEdlKCnZ/Vq0SGV
skwwsPsG8xdUGyX2Bg5mPM5X5NVEamR4oSrlTj0iTPMwLhMeUWVO1s0=
—–END RSA PRIVATE KEY—–

À partir da chave privada criada, criaremos uma chave pública. Lembre-se de armazenar a chave privada, pois ela não pode ser compartilhada. Nos certificados digitais, a chaves privada, dependendo do tipo do certificado, é gerada dentro de um dispositivo criptográfico entregue ao solicitante e a chave pública é armazenada em um hardware mantido pela Autoridade Certificadora. Esses são alguns dos conceitos da Infraestrutura de Chaves Públicas.

$openssl rsa -in privkey.kp -pubout -out pubkey.kp

Esse comando produziu um arquivo chamado pubkey.kp cujo conteúdo é:

—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0s2xwy0/awWsYBSTWV+C
4MwgBgGw3lj6WiLiXD6oRdhVgEFQ2PjUJPF0r90McWXmFvVyTlQIFqATtsI7XeMx
aI8mecHZpaZWkuWwn9P5Y/oaEfndSwzdpugY1yveho39PBKBipuypcPhPEee/fHT
eoQiua4FXiCUWhKMSqGBWN830sOwfZwzKVw5N0JS0HFjiB/PO8TTy5hJ2p+Wb6S2
uUwQdo8fwvvD1hNeJiJVH22s+fDhmG9PDMpOrzXpRkiC9YzzXTRZwOn6oRtXTKIF
5LdvpxwKSi641Yl2yCnUW7A7V9zYUVIOh4m9blP+XGJvW22+l3dAd7gfyXyxZB0v
9QIDAQAB
—–END PUBLIC KEY—–

Chaves Pública e Privada em um Mesmo Arquivo

Adicionalmente, suponha que você já tenha um arquivo, que chamaremos de keypair.kp, cujo conteúdo seja a concatenação das chaves privada e pública:

—–BEGIN RSA PRIVATE KEY—–
MIIEowIBAAKCAQEAzupZUuiV9mS1i1KRQKFyYeo6fwFZB1GumwPnkHi6xNgX3YgK
kZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2VjwaqZMiOBHCXJjZZe6lYRumbMUD
cEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QLTpDNCf4fyY6IdZHQINEnKJdxT1Rv
7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVBkPYrqtjAhMHwKZo5Zi7bcBM5vmJ3
b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw0XPTWz0luHbcsvKVK0PBSt0ciWeZ
TGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwVGQIDAQABAoIBABXPZfLzSTtbijdR
ULY7Tk873Uad4cB/v6PfWX1E/IrbLEjRmiuWJNAskg+O9l6uRCaMeKfkCuRen5vY
RUhjmoakdzsAo069sHsKMYApE42U2IoGikI/jGNU8Hj34QNcjYo4NVQDclbpIAWL
G6oEJRz27mXrP3aDa6bY49NRuIrymumsCksMT+jR1fW7sYMmDr8drdSyMn4LROSN
ntiSBG2Ab3ltiZPhGI/YTxru+C8xzU9htqVwvKqVtcEfNZ17g6fd/W29mTGB+B5S
zDjFmm5fTJW2iiEPpZ8hFYlo4lqXtTtALdJndMk4f8vbs8mfgRAB9qbuYqv2ijY/
EoSNFAECgYEA/EE+TtN8zoYf6LLE7FXIXKZX6VHrbbyQhFyrhJ8UC8vhemtTcli2
2nKzaJN4Vv5voXkKMlp4J3NL45VIIx6kupWMqEls3a6HLhZ5AnegVlNeK/kQFFaH
7Q9lpnntpFIHOQe4FrH8maEs1you2fvJafgRzpVUlmKPgVCsOnl5K3kCgYEA0fzI
KNig3044lKZAszXb/iPUHq4TdPcSiqeEjzMPd+Zmxx4hbrsjYPuAbMsTfiNMRC2p
3yECCuUSpuwlgVbf9Ol4PEd8PWaMDyLDYT/2tcS6YWErvVlFG9uhgyF1sh1fdNB+
Z61YK1/uOC7rQTYZt2NNiFL495CmUOTRk6loLqECgYBSr2gnGneskpZfBko6VZwJ
kpT6a9nJ7KdKW731CNffTgMox4lgz+eQD0zzmHM3wMsCmNRY0QLVm5tijApLSL4i
Uub6OqcuuwigeMlNn7y0zzrtGwTEReDkOcnOGeVlmWW4sekLt2ffS8+Q78jPtxK8
Y44isxw49zGm57SsriijsQKBgQCAP1yX5cZK2+EemHNHgIt9qbAxlKt5cjS2zhzd
wJef6O24iqRslorC/peu2lBrZ2967FClX+l5cfJ0VCGL3t0lHTo7xoUQkwLTc63U
RVaOKTqTot8t48mbfAYmqlbRk7LrCzNIasxAoXRCiBVSXJJUOKfvrI011fhdy4Jc
JsjkQQKBgEZsXhqYO+BK7IbOlVRwiN2kC6XlZl7lClpkjGPw7JVt0OZ/7EUni59O
e1UPHwflzdInOrog8UpVqJJp6Xp9hK14gIdtFMFIncak8DspCYdviYnaUJALXhO2
HjG1eqrp1E701fGJKHKFSonWogKa+7ecBgm9FaDHJcULfJorYeRf
—–END RSA PRIVATE KEY—–
—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzupZUuiV9mS1i1KRQKFy
Yeo6fwFZB1GumwPnkHi6xNgX3YgKkZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2
VjwaqZMiOBHCXJjZZe6lYRumbMUDcEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QL
TpDNCf4fyY6IdZHQINEnKJdxT1Rv7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVB
kPYrqtjAhMHwKZo5Zi7bcBM5vmJ3b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw
0XPTWz0luHbcsvKVK0PBSt0ciWeZTGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwV
GQIDAQAB
—–END PUBLIC KEY—–

Nesse caso, rode o openssl com os parâmetros abaixo para extrair a chave privada desse arquivo, remova o trecho referente à chave privada daquele arquivo e o renomeie para “pubkey.kp”:

$openssl rsa -in keypair.kp -out privkey.kp
$mv keypair.kp pubkey.kp

O conteúdo desse arquivo ficará assim:

—–BEGIN RSA PRIVATE KEY—–
MIIEowIBAAKCAQEAzupZUuiV9mS1i1KRQKFyYeo6fwFZB1GumwPnkHi6xNgX3YgK
kZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2VjwaqZMiOBHCXJjZZe6lYRumbMUD
cEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QLTpDNCf4fyY6IdZHQINEnKJdxT1Rv
7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVBkPYrqtjAhMHwKZo5Zi7bcBM5vmJ3
b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw0XPTWz0luHbcsvKVK0PBSt0ciWeZ
TGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwVGQIDAQABAoIBABXPZfLzSTtbijdR
ULY7Tk873Uad4cB/v6PfWX1E/IrbLEjRmiuWJNAskg+O9l6uRCaMeKfkCuRen5vY
RUhjmoakdzsAo069sHsKMYApE42U2IoGikI/jGNU8Hj34QNcjYo4NVQDclbpIAWL
G6oEJRz27mXrP3aDa6bY49NRuIrymumsCksMT+jR1fW7sYMmDr8drdSyMn4LROSN
ntiSBG2Ab3ltiZPhGI/YTxru+C8xzU9htqVwvKqVtcEfNZ17g6fd/W29mTGB+B5S
zDjFmm5fTJW2iiEPpZ8hFYlo4lqXtTtALdJndMk4f8vbs8mfgRAB9qbuYqv2ijY/
EoSNFAECgYEA/EE+TtN8zoYf6LLE7FXIXKZX6VHrbbyQhFyrhJ8UC8vhemtTcli2
2nKzaJN4Vv5voXkKMlp4J3NL45VIIx6kupWMqEls3a6HLhZ5AnegVlNeK/kQFFaH
7Q9lpnntpFIHOQe4FrH8maEs1you2fvJafgRzpVUlmKPgVCsOnl5K3kCgYEA0fzI
KNig3044lKZAszXb/iPUHq4TdPcSiqeEjzMPd+Zmxx4hbrsjYPuAbMsTfiNMRC2p
3yECCuUSpuwlgVbf9Ol4PEd8PWaMDyLDYT/2tcS6YWErvVlFG9uhgyF1sh1fdNB+
Z61YK1/uOC7rQTYZt2NNiFL495CmUOTRk6loLqECgYBSr2gnGneskpZfBko6VZwJ
kpT6a9nJ7KdKW731CNffTgMox4lgz+eQD0zzmHM3wMsCmNRY0QLVm5tijApLSL4i
Uub6OqcuuwigeMlNn7y0zzrtGwTEReDkOcnOGeVlmWW4sekLt2ffS8+Q78jPtxK8
Y44isxw49zGm57SsriijsQKBgQCAP1yX5cZK2+EemHNHgIt9qbAxlKt5cjS2zhzd
wJef6O24iqRslorC/peu2lBrZ2967FClX+l5cfJ0VCGL3t0lHTo7xoUQkwLTc63U
RVaOKTqTot8t48mbfAYmqlbRk7LrCzNIasxAoXRCiBVSXJJUOKfvrI011fhdy4Jc
JsjkQQKBgEZsXhqYO+BK7IbOlVRwiN2kC6XlZl7lClpkjGPw7JVt0OZ/7EUni59O
e1UPHwflzdInOrog8UpVqJJp6Xp9hK14gIdtFMFIncak8DspCYdviYnaUJALXhO2
HjG1eqrp1E701fGJKHKFSonWogKa+7ecBgm9FaDHJcULfJorYeRf
—–END RSA PRIVATE KEY—–

Se você quiser, pode acrescentar uma senha para proteção da chave privada:

$openssl rsa -in keypair.kp -out privkey.kp -des3 -passout pass:Teste123

Renomeie o arquivo “keypair.kp” para “pubkey.kp”. Abra o arquivo “pubkey.kp” e remova o trecho referente à chave privada. O arquivo se parecerá com esse:

—–BEGIN PUBLIC KEY—–
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzupZUuiV9mS1i1KRQKFy
Yeo6fwFZB1GumwPnkHi6xNgX3YgKkZPN1agIKFuII795lP+GnB2/+mxbszXZx7Q2
VjwaqZMiOBHCXJjZZe6lYRumbMUDcEex1tcUhufpSsSXcxglNwYEPOeAeC96x4QL
TpDNCf4fyY6IdZHQINEnKJdxT1Rv7i00d8OeF2pk8z3Y1QJDrZQghjHEvpxqBqVB
kPYrqtjAhMHwKZo5Zi7bcBM5vmJ3b5iDs1MjvHYLgd0TPBQPiz3bKQ5CbDAuMFHw
0XPTWz0luHbcsvKVK0PBSt0ciWeZTGeQs+xnaYmQpS/d5HPk8t2ygKuZdukBtSwV
GQIDAQAB
—–END PUBLIC KEY—–

Verificação

Vamos simular o envio de uma mensagem criptografada de um remetente para um receptor. O remetente possui a chave pública do receptor e a utilizará para criptografar a mensagem. Crie um arquivo qualquer e insira um pequeno texto nele. Criei o arquivo arquivo.txt:

$openssl rsautl -encrypt -inkey pubkey.kp -pubin -in arquivo.txt -out encriptado.ssl

Esse comando produziu o arquivo encriptado.ssl, que está criptografado e só poderá ser lido por quem detiver a chave privada relacionada à chave pública. É importante lembrar que na criptografia assimétrica, uma mensagem pode ser criptografada ou descriptografada com ambas as chaves, mas se uma for utilizada para criptografar, apenas a outra poderá ser utilizada para descriptografar:

$openssl rsautl -decrypt -inkey privkey.kp -in encriptado.ssl -out decripatado.txt

O arquivo decripatado.txt possui o texto original enviado pelo remetente.

Referências

1. [https://stackoverflow.com/questions/5244129/use-rsa-private-key-to-generate-public-key]
2. [https://rietta.com/blog/2012/01/27/openssl-generating-rsa-key-from-command/]
3. [https://blog.sleeplessbeastie.eu/2017/12/28/how-to-generate-private-key/]
4. [https://www.mkssoftware.com/docs/man1/openssl_genrsa.1.asp]
5. [https://www.devco.net/archives/2006/02/13/public_-_private_key_encryption_using_openssl.php]
6. [https://unix.stackexchange.com/questions/296697/how-to-encrypt-a-file-with-private-key]