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??
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-----
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
Lao
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:
Filef=newFile("MeuCert.PEM");//Arquivo apenas com -----BEGIN CERTIFICATE-----(CERTIFICADO)-----END CERTIFICATE-----FileInputStreamfis=newFileInputStream(f);BASE64Encoderbe=newBASE64Encoder();CertificateFactorycf=CertificateFactory.getInstance("X.509");BufferedInputStreambis=newBufferedInputStream(fis);X509Certificateccc=(X509Certificate)cf.generateCertificate(bis);RSAPublicKeypubKey=(RSAPublicKey)ccc.getPublicKey();X509EncodedKeySpecx509Key=newX509EncodedKeySpec(pubKey.getEncoded());StringWritersw=newStringWriter();PEMWriterpw=newPEMWriter(sw,"BC");pw.writeObject(pubKey);pw.flush();sw.flush();System.out.println(sw);MessageDigestmd=MessageDigest.getInstance("MD5");Stringcert=sw.toString().replace("\r\n","\n");//Estou usando isso porque com o OPENSSL ele gera a quebra de linha so com \nStringmd5=newString(Hex.encode(md.digest(cert.getBytes())));System.out.println("MD5 => "+md5.toUpperCase());fis.close();sw.close();pw.close();
L
Lao
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
thingol
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:
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.