{"id":1934,"date":"2022-03-07T18:53:11","date_gmt":"2022-03-07T18:53:11","guid":{"rendered":"https:\/\/wordpress.pedrorotoli.com\/?p=1934"},"modified":"2022-03-07T19:10:52","modified_gmt":"2022-03-07T19:10:52","slug":"encriptar-e-desencriptar-arquivos-usando-chaves-publicas-e-privadas","status":"publish","type":"post","link":"https:\/\/wordpress.pedrorotoli.com\/?p=1934","title":{"rendered":"Encriptar e desencriptar arquivos usando chaves p\u00fablicas e privadas"},"content":{"rendered":"<h3>Gerar Par de Chaves P\u00fablica\/Privada<\/h3>\n<p>Para encriptar arquivos usando uma chave p\u00fablica, primeiro \u00e9 preciso gerar uma chave privada, que por sua vez ser\u00e1 utilizada para gerar um certificado\/chave p\u00fablica.<\/p>\n<p>A chave privada pode ser gerada com o seguinte comando:<\/p>\n<pre>openssl genpkey -aes-256-cbc -algorithm RSA -out <strong>chave-privada.pem<\/strong> -pkeyopt rsa_keygen_bits:<strong>4096<\/strong> -pass pass:<strong>senha<\/strong><\/pre>\n<p>A op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">rsa_keygen_bits<\/span> indica o tamanho da chave, quanto maior, potencialmente mais segura, mas com rendimentos decrescentes \u00e0 partir de certo ponto, a op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">pass<\/span> serve para indicar a senha usada para proteger a chave, para que ela n\u00e3o possa ser usada sem autoriza\u00e7\u00e3o para desencriptar os arquivos, e o argumento <span style=\"font-family: andale mono, monospace;\">-out<\/span> serve para indicar o nome e localiza\u00e7\u00e3o onde deseja salvar a chave.<\/p>\n<p>Com isso j\u00e1 temos a chave privada criada, agora \u00e9 preciso criar a chave p\u00fablica, que ser\u00e1 utilizada para encriptar os arquivos.<\/p>\n<p>Ela pode ser criada com o seguinte comando:<\/p>\n<pre>openssl req -new -x509 -key <strong>chave-privada.pem<\/strong> -passin pass:<strong>senha<\/strong> -out <strong>chave-publica.pem<\/strong> -days <strong>3650<\/strong><\/pre>\n<p>Esse comando ir\u00e1 gerar um certificado, n\u00e3o muito diferente de um certificado utilizado em um website.<\/p>\n<p>A op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">-key chave-privada.pem<\/span> indica qual a chave privada a ser utilizada para gerar a chave p\u00fablica, nesse caso, a chave que acabamos de criar, novamente, a op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">pass<\/span> vai indicar a senha que foi utilizada para proteger a chave privada, a op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">-out chave-publica.pem<\/span> vai indicar o nome e local onde a chave p\u00fablica ser\u00e1 salva, e a op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">-days 3650<\/span> vai indicar a validade desse certificado\/chave p\u00fablica, nesse caso, apenas porque sim, ela foi gerada com uma validade de 3650 dias, ou 10 anos.<\/p>\n<p>Entretanto, para facilitar a gera\u00e7\u00e3o de pares de chaves p\u00fablicas e privadas, \u00e9 mais f\u00e1cil utilizar um script para isso:<\/p>\n<pre>#!\/bin\/bash\r\nopenssl genpkey -aes-256-cbc -algorithm RSA -out ${1}-priv.pem -pkeyopt rsa_keygen_bits:4096 -pass pass:$2\r\nopenssl req -new -x509 -key ${1}-priv.pem -passin pass:$2 -out ${1}-pub.pem -days 3650 -subj '\/C='<\/pre>\n<p>Para utilizar esse script \u00e9 s\u00f3 o executar normalmente e passar como argumento o nome que deseja dar \u00e0s chaves e a senha que deseja utilizar, e ele ir\u00e1 gerar automaticamente, sem pedir uma senha ou as informa\u00e7\u00f5es que normalmente s\u00e3o pedidas durante a cria\u00e7\u00e3o de um certificado\/chave p\u00fablica, e ir\u00e1 criar dois arquivos a chave privada, <span style=\"font-family: andale mono, monospace;\">nomeDaChave<strong>-priv.pem<\/strong><\/span>, e a chave p\u00fablica, <span style=\"font-family: andale mono, monospace;\">nomeDaChave<strong>-pub.pem<\/strong><\/span>, e com isso j\u00e1 temos as nossas chaves que ser\u00e3o utilizadas para encriptar e desencriptar os arquivos.<\/p>\n<h3>Encriptar Arquivos<\/h3>\n<p>O comando para encriptar um arquivo \u00e9 o seguinte:<\/p>\n<pre>openssl smime -encrypt -binary -aes256 -in <strong>nomeDoArquivo<\/strong> -out <strong>nomeDoArquivo.enc<\/strong> -outform DER <strong>chave-publica.pem<\/strong><\/pre>\n<p>A op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">-in nomeDoArquivo<\/span> vai indicar o arquivo a ser encriptado, e a op\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">-out nomeDoArquivo.enc<\/span> o nome do arquivo encriptado (a exten\u00e7\u00e3o <span style=\"font-family: andale mono, monospace;\">.enc<\/span> serve apenas para indicar que o arquivo est\u00e1 encriptado, n\u00e3o \u00e9 preciso usar essa extens\u00e3o especificamente), e no final \u00e9 especificada a chave p\u00fablica a ser utilizada.<\/p>\n<p>Novamente, podemos criar um script para facilitar esse processo:<\/p>\n<pre>#!\/bin\/bash\r\nopenssl smime -encrypt -binary -aes256 -in $1 -out ${1}.enc -outform DER $2<\/pre>\n<p>Esse script precisa de dois argumentos, o nome e localiza\u00e7\u00e3o do arquivo a ser encriptado e o nome e localiza\u00e7\u00e3o da chave p\u00fablica a ser utilizada para a encripta\u00e7\u00e3o, e ir\u00e1 gerar automaticamente um arquivo encriptado com o nome completo do arquivo original mais a extens\u00e3o <span style=\"font-family: andale mono, monospace;\">.enc<\/span>.<\/p>\n<h3>Desencriptar Arquivos<\/h3>\n<p>O comando para desencriptar o arquivo \u00e9 o seguinte:<\/p>\n<pre><span style=\"font-family: andale mono, monospace;\">openssl smime -decrypt -in <strong>nomeDoArquivo.enc<\/strong> -binary -inform DEM -inkey <strong>chave-privada.pem<\/strong> -out <strong>nomeDoArquivo<\/strong> -passin pass:<strong>senha<\/strong><\/span><\/pre>\n<p>Esse comando \u00e9 similar ao anterior, \u00e9 preciso especificar o nome do arquivo que est\u00e1 encriptado, dessa vez a chave privada, o nome do arquivo desencriptado, com a maior diferen\u00e7a sendo a senha para poder acessar a chave privada.<\/p>\n<p>Novamente, \u00e9 poss\u00edvel criar um script para facilitar o processo:<\/p>\n<pre>#!\/bin\/bash\r\nopenssl smime -decrypt -in $1 -binary -inform DEM -inkey $3 -out $2 -passin pass:$4<\/pre>\n<p>Esse script aceita quatro argumentos, o primeiro \u00e9 o arquivo encriptado, o segundo \u00e9 o nome que deseja dar ao arquivo desencriptado, a chave privada, e por \u00faltimo, a senha da chave privada.<\/p>\n<p>E com isso \u00e9 poss\u00edvel encriptar arquivos de maneira segura.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gerar Par de Chaves P\u00fablica\/Privada Para encriptar arquivos usando uma chave p\u00fablica, primeiro \u00e9 preciso gerar uma chave privada, que por sua vez ser\u00e1 utilizada<\/p>\n","protected":false},"author":1,"featured_media":1940,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[78,76,77],"class_list":["post-1934","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-encryption","tag-openssl","tag-rsa"],"_links":{"self":[{"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=\/wp\/v2\/posts\/1934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1934"}],"version-history":[{"count":7,"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=\/wp\/v2\/posts\/1934\/revisions"}],"predecessor-version":[{"id":1942,"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=\/wp\/v2\/posts\/1934\/revisions\/1942"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=\/wp\/v2\/media\/1940"}],"wp:attachment":[{"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.pedrorotoli.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}