如何使用base-64编码的公钥对字节数组进行RSA加密?
在阅读了几篇关于如何在Java中进行RSA加密的文章(谷歌搜索)之后,找到了以下代码段
public byte[] rsaEncrypt(byte[] data) {
PublicKey pubKey = readKeyFromFile("/public.key");
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherData = cipher.doFinal(src);
return cipherData;
}
我将公钥作为base64编码的字符串(126个字符),如何使用编码字符串创建“PublicKey”并将其与Cipher一起使用。
答案 0 :(得分:8)
您的base64字符串可能是X509EncodedKeySpec。我只能猜测。如果是这样,您应该对字符串进行base64解码以获得byte []
。然后从此X509EncodedKeySpec
构建byte []
。然后创建RSA KeyFactory
的实例,并使用此KeyFactory的generatePublic()
方法获取PublicKey
。然后可以将此公钥传递给Cipher.init()
。
注意:要执行base64解码,请使用apache commons codec或the Harder base64 decoder。
2017年3月8日更新:
在优于迟到的新闻中,Java 8现在包括Base64编码/解码类java.util.Base64
答案 1 :(得分:4)
这是您生成公钥和私钥对的方法 下面是将它们存储在硬盘中的功能
enter code here
public static void GenerateKeyPair()
{
try{
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.genKeyPair();
KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(),
RSAPublicKeySpec.class);
RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(),
RSAPrivateKeySpec.class);
saveToFile("public.key", pub.getModulus(),
pub.getPublicExponent());
saveToFile("private.key", priv.getModulus(),
priv.getPrivateExponent());
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public static void saveToFile(String fileName,
BigInteger mod, BigInteger exp) throws Exception {
ObjectOutputStream oout = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream(fileName)));
try {
oout.writeObject(mod);
oout.writeObject(exp);
} catch (Exception e) {
throw new Exception("error", e);
} finally {
oout.close();
}
}