Eu gerei uma chave privada com:
openssl genrsa [-out file] –des3
Depois disso, gerei uma chave pública com:
openssl rsa –pubout -in private.key [-out file]
Quero assinar algumas mensagens com minha chave privada e verificar algumas outras mensagens com minha chave pública, usando um código como este:
public String sign(String message) throws SignatureException{
try {
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initSign(privateKey);
sign.update(message.getBytes("UTF-8"));
return new String(Base64.encodeBase64(sign.sign()),"UTF-8");
} catch (Exception ex) {
throw new SignatureException(ex);
}
}
public boolean verify(String message, String signature) throws SignatureException{
try {
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initVerify(publicKey);
sign.update(message.getBytes("UTF-8"));
return sign.verify(Base64.decodeBase64(signature.getBytes("UTF-8")));
} catch (Exception ex) {
throw new SignatureException(ex);
}
}
Eu encontrei uma solução para converter minha chave privada para o formato PKCS8 e carregá-la. Funciona com alguns códigos como este:
public PrivateKey getPrivateKey(String filename) throws Exception {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf =
KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}
E, finalmente, minha pergunta é: como carrego minha chave pública RSA de um arquivo?
Acho que talvez precise converter meu arquivo de chave pública para o formato x509 e usar X509EncodedKeySpec
. Mas como posso fazer isso?
Respostas:
Abaixo está a informação relevante a partir do link que Zaki fornecido.
Chave privada
Chave pública
fonte
InvalidKeyException
quando tentei com arquivos que gerei com ossh-keygen -t rsa -b 2048
comando. Com arquivos gerados com os comandos da solução funcionou..pem
formato em vez de.der
, você pode usar a classe PemReader de BouncyCastle para analisá-la antes de passá-la paraX509EncodedKeySpec
. Lembre-se de também especificar o provedor BouncyCastle ao criar a instância KeyFactory.Este programa faz quase tudo com chaves públicas e privadas. O formato der pode ser obtido, mas salvando dados brutos (sem codificação base64). Espero que isso ajude os programadores.
fonte
Depois de ter sua chave armazenada em um arquivo PEM, você pode lê-la facilmente usando as classes PemObject e PemReader fornecidas por BouncyCastle, conforme mostrado neste tutorial .
Crie uma classe PemFile que encapsula o manuseio de arquivos:
Em seguida, instancie as chaves privadas e públicas como de costume:
Espero que isto ajude.
fonte
O código abaixo funciona perfeitamente bem para mim e está funcionando. Este código lerá a chave pública e privada RSA por meio do código Java. Você pode consultar http://snipplr.com/view/18368/
fonte