Fundamentos dos Formatos de Chave Privada RSA
No universo da criptografia de chave pública, as chaves privadas RSA são elementos cruciais para a segurança de operações como assinatura digital e descriptografia de dados. Essas chaves podem ser armazenadas em diferentes formatos, sendo os mais comuns o PKCS#1 e o PKCS#8. O PKCS#1 é o padrão original para chaves RSA, focado exclusivamente nas particularidades deste algoritmo. Já o PKCS#8, por sua vez, oferece uma estrutura mais genérica para qualquer tipo de chave privada (RSA, DSA, ECC, etc.), sendo amplamente adotado em ambientes modernos, como o ecossistema Java, devido à sua flexibilidade e capacidade de encapsular metadados sobre o algoritmo da chave.
Geração de Chave Privada RSA no Formato PKCS#1
Para iniciar, vamos demonstrar como gerar uma nova chave privada RSA diretamente no formato PKCS#1 utilizando a ferramenta de linha de comendo OpenSSL. Este exemplo criará uma chave de 1024 bits:
openssl genrsa -out chave_rsa_pkcs1.pem 1024
O conteúdo do arquivo resultante, nomeado aqui como chave_rsa_pkcs1.pem, começará com o marcador -----BEGIN RSA PRIVATE KEY-----, indicando explicitamente o formato PKCS#1. Um exemplo de tal conteúdo é:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC5BW6T9GVaaG/epGDjPpY3wN0DrBt+NojvxkEgpUdOAxgAepqeGbSqtXAd+MOOBbHxIOEwrFC9stkypQgxrB49tXDI+4Jj8MuKI15HEmI8k7+tRDOlJ5TFSL2J9KA3GuQbyVAhlpxl+YnV7yjxP9l1dkbApg1ixSd5KOPbaQ00WQIDAQABAoGAYiqzpOTC8dj/og1tKqUGZsZ5fX1PiQO+XBnAbGXFE2sozPhAGSpiZUCnH//hIfV7mAht8rk6java+bf+RPyhfg0zW7oXy0pm8DwoW7+0fOzQ4sEYeoqza/VrkYwR5BxBa+KyT1HCi4uXogyDlQT1p0ZT0iaqZBfTApdyVkmcQEECQQDhfPl+ILl0bh0H8ORoMmmxAZMn293+de441OlAjL3CsF4yhUUdavAYWM0RAV5MJtKUTR4ZpRXkB/pqkgyTxpr9AkEA0g6pQRpcGxulr2758ZlOLdL8B1n1ubre464IKQ0zNfERKhR/j7U8LGF+3mhZuoSEdklwLCJ8ZMvIhkV0v8JjjQJBANtqXOyas1vUenNruRabV7ViLuuuS0p9Px4WMBMb4Ns9+6t1e1e w44kNgB54EmZPsMGWeR/DQJXwHYDuNUbnD5ECQA7SGf8N7RG8kaQfIGN7fZieGkoqfrvsA23tCYZb+BEGQT/G0nlBQE2hU2I92pbeYro11ERI6p3yAuP2YpZlEMECQGNzhqshYfDiWwU4Q3aZWkRrv74uIXk1HQoFH1BthzQJTbzKH/LEqZN8WVau3bf41yAx2YoaOsIJJtOUTYcfh14=
-----END RSA PRIVATE KEY-----
Conversão de Chave Privada PKCS#1 para PKCS#8
A transição de uma chave privada do formato PKCS#1 para o PKCS#8 é uma prática comum, especialmente quando se visa a integração com plataformas ou bibliotecas que preferem ou exigem o formato PKCS#8, como é o caso de muitas APIs de criptografia em Java. O PKCS#8 encapsula a chave privada RSA dentro de uma estrutura ASN.1 mais flexível, que inclui um identificador de objeto (OID) para o algoritmo da chave.
Para converter a chave privada que acabamos de gerar (chave_rsa_pkcs1.pem) para o formato PKCS#8, sem aplicar criptografia adicional (para fins de demonstração), utilize o comando OpenSSL a seguir:
openssl pkcs8 -topk8 -inform PEM -in chave_rsa_pkcs1.pem -outform PEM -nocrypt -out chave_rsa_pkcs8.pem
O arquivo chave_rsa_pkcs8.pem gerado terá um cabeçalho diferente, -----BEGIN PRIVATE KEY-----, que sinaliza o formato PKCS#8. Observe o exemplo a seguir:
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALkFbpP0ZVpob96kYOM+ljfA3QOsG342iO/GQSClR04DGAB6mp4ZtKq1cB34w44FsfEg4TCsUL2y2TKlCDGsHj21cMj7gmPwy4ojXkcSYjyTv61EM6UnlMVIvYn0oDca5BvJUCGWnGX5idXvKPE/2XV2RsCmDWLFJ3ko49tpDTRZAgMBAAECgYBiKrOk5MLx2P+iDW0qpQZmxnl9fU+JA75cGcBsZcUTayjM+EAZKmJlQKcf/+Eh9XuYCG3yuTqNq9r5t/5E/KF+DTNbuhfLSmbwPChbv7R87NDiwRh6irNr/VrkYwR5BxBa+KyT1HCi4uXogyDlQT1p0ZT0iaqZBfTApdyVkmcQEECQQDhfPl+ILl0bh0H8ORoMmmxAZMn293+de441OlAjL3CsF4yhUUdavAYWM0RAV5MJtKUTR4ZpRXkB/pqkgyTxpr9AkEA0g6pQRpcGxulr2758ZlOLdL8B1n1ubre464IKQ0zNfERKhR/j7U8LGF+3mhZuoSEdklwLCJ8ZMvIhkV0v8JjjQJBANtqXOyas1vUenNruRabV7ViLuuuS0p9Px4WMBMb4Ns9+6t1e1ew44kNgB54EmZPsMGWeR/DQJXwHYDuNUbnD5ECQA7SGf8N7RG8kaQfIGN7fZieGkoqfrvsA23tCYZb+BEGQT/G0nlBQE2hU2I92pbeYro11ERI6p3yAuP2YpZlEMECQGNzhqshYfDiWwU4Q3aZWkRrv74uIXk1HQoFH1BthzQJTbzKH/LEqZN8WVau3bf41yAx2YoaOsIJJtOUTYcfh14=
-----END PRIVATE KEY-----
Conversão de Chave Privada PKCS#8 para PKCS#1
Embora o PKCS#8 seja o formato preferencial em muitos contextos modernos, pode haver cenários onde seja necessário converter uma chave privada PKCS#8 de volta para o formato PKCS#1. Isso é comum para manter compatibilidade com sistemas legados ou com ferramentas que foram projetadas para operar especificamente com o formato tradicional de chaves RSA.
Para reverter a chave privada de chave_rsa_pkcs8.pem para o formato PKCS#1, execute o seguinte comando OpenSSL:
openssl rsa -in chave_rsa_pkcs8.pem -out chave_rsa_pkcs1_restaurada.pem
Após a execução, o arquivo chave_rsa_pkcs1_restaurada.pem conterá a chave no formato PKCS#1, com o cabeçalho -----BEGIN RSA PRIVATE KEY-----, idêntico ao conteúdo da chave gerada inicialmente:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC5BW6T9GVaaG/epGDjPpY3wN0DrBt+NojvxkEgpUdOAxgAepqeGbSqtXAd+MOOBbHxIOEwrFC9stkypQgxrB49tXDI+4Jj8MuKI15HEmI8k7+tRDOlJ5TFSL2J9KA3GuQbyVAhlpxl+YnV7yjxP9l1dkbApg1ixSd5KOPbaQ00WQIDAQABAoGAYiqzpOTC8dj/og1tKqUGZsZ5fX1PiQO+XBnAbGXFE2sozPhAGSpiZUCnH//hIfV7mAht8rk6java+bf+RPyhfg0zW7oXy0pm8DwoW7+0fOzQ4sEYeoqza/VrkYwR5BxBa+KyT1HCi4uXogyDlQT1p0ZT0iaqZBfTApdyVkmcQEECQQDhfPl+ILl0bh0H8ORoMmmxAZMn293+de441OlAjL3CsF4yhUUdavAYWM0RAV5MJtKUTR4ZpRXkB/pqkgyTxpr9AkEA0g6pQRpcGxulr2758ZlOLdL8B1n1ubre464IKQ0zNfERKhR/j7U8LGF+3mhZuoSEdklwLCJ8ZMvIhkV0v8JjjQJBANtqXOyas1vUenNruRabV7ViLuuuS0p9Px4WMBMb4Ns9+6t1e1ew44kNgB54EmZPsMGWeR/DQJXwHYDuNUbnD5ECQA7SGf8N7RG8kaQfIGN7fZieGkoqfrvsA23tCYZb+BEGQT/G0nlBQE2hU2I92pbeYro11ERI6p3yAuP2YpZlEMECQGNzhqshYfDiWwU4Q3aZWkRrv74uIXk1HQoFH1BthzQJTbzKH/LEqZN8WVau3bf41yAx2YoaOsIJJtOUTYcfh14=
-----END RSA PRIVATE KEY-----