Dúvida sobre Formatação PEM

6 respostas
L

Galera, alguem aí que já mexeu com criptografia asimétrica sabe uma maneira de formatar em formato PEM uma chave(pública ou privada) da seguinte maneira:
-----BEGIN RSA PUBLIC KEY-----
MII(IjAEIEAjaiejfaijfIAEJfoiAF98jfaejfasidja
AmAMIg;giJAeogjAOiejgAOjeAOEijgOAIEjg //Quebra a cada 64 caracteres…
AOEijgaoijg(etc…)
-----END RSA PUBLIC KEY-----

Tem alguma classe que faça isso ou teria que ser feito à mão??

Obrigado

6 Respostas

T

No BouncyCastle há algumas classes que lidam com isso.
http://www.bouncycastle.org

L

Você sabe dizer qual/quais classes thingol? Porque eu andei olhando a documentação e não achei nada que fizesse isso. Só sei que na API da Sun eu uso a X509EncodedKeySpec que faz o inverso…Lê de um conjunto de bytes(de um arquivo) e cria a estrutura lógica da chave. Mas não achei um que faça o inverso…

Por exemplo crio um KeyPair e gero a chave publica e mando gravar num arquivo pra gerar o -----Begin RSA PuB KEY----MIjGiJAKmjim(938(k[telefone removido](4jl3lI8Ojoji3lJlkjLj#hhLLJoijega87AjnAej32987LKJnA----END RSA PUB KEY-----

Entendeu?

T

http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/openssl/PEMWriter.html

OK, você deve estar meio transtornado porque não estou dando um exemplo legal aqui. Mas acho que dando uma olhada nos exemplos do BouncyCastle (ou mesmo nos exemplos do livro “Beginning Cryptography in Java”, de David Hook - você pode baixar esses exemplos do site da Wrox, se não me engano - dá para ver como é que se usa a PEMWriter.

(Não dou um exemplo aqui, porque eu mesmo nunca usei essa classe. Eu já tive de lidar com esse formato antes, mas usando diretamente o OpenSSL. )

L

Valeu pela ajuda cara. É usando a PEMWriter mesmo, eu tava lerdando aqui, mas agora tá beleza. Vou botar um trecho do código aqui caso o pessoal também tenha essa dúvida:

File f = new File("MeuCert.PEM");//Arquivo apenas com -----BEGIN CERTIFICATE-----(CERTIFICADO)-----END CERTIFICATE-----
			FileInputStream fis = new FileInputStream(f);
			BASE64Encoder be = new BASE64Encoder();
			CertificateFactory cf = CertificateFactory.getInstance("X.509");
			BufferedInputStream bis = new BufferedInputStream(fis);
			X509Certificate ccc = (X509Certificate) cf.generateCertificate(bis);
			RSAPublicKey pubKey = (RSAPublicKey) ccc.getPublicKey();
			X509EncodedKeySpec x509Key = new X509EncodedKeySpec(pubKey.getEncoded());
			StringWriter sw = new StringWriter();
			PEMWriter pw = new PEMWriter(sw,"BC");
			pw.writeObject(pubKey);
			pw.flush();
			sw.flush();
			System.out.println(sw);
			MessageDigest md = MessageDigest.getInstance("MD5");
			String cert = sw.toString().replace("\r\n", "\n");//Estou usando isso porque com o OPENSSL ele gera a quebra de linha so com \n
			String md5 = new String(Hex.encode(md.digest(cert.getBytes())));
			System.out.println("MD5 => "+md5.toUpperCase());
			fis.close();
                        sw.close();
                        pw.close();
L

Porém tenho um problema com isso. Não consigo gerar uma
-----BEGIN RSA PUBLIC KEY--------, apenas -----BEGIN PUBLIC KEY----- . E pelo que eu vi são diferentes…

T

Eu dei uma olhada no fonte de PEMWriter na versão 1.33 do BouncyCastle. Aparentemente ele não suporta escrever “-----BEGIN RSA PUBLIC KEY-----”, apenas:

-----BEGIN CERTIFICATE-----
-----BEGIN X509 CRL-----
-----BEGIN RSA PRIVATE KEY-----
-----BEGIN DSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
-----BEGIN ATTRIBUTE CERTIFICATE-----
-----BEGIN CERTIFICATE REQUEST-----
-----BEGIN PKCS7-----

Veja se você pode baixar uma versão mais nova do BouncyCastle e veja se existe suporte para isso. Se não houver, você pode tentar modificar o código de PEMWriter.

Criado 9 de maio de 2008
Ultima resposta 15 de mai. de 2008
Respostas 6
Participantes 2