在安卓上使用 RSA 算法加密了一个字符串,然后 Base64 了一下;
在 Mac 上使用 Java 先转码再解密这个加密后转码的字符串,遇到了如下错误:
javax.crypto.BadPaddingException: Decryption error
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at RSAUtils.decryptData(RSAUtils.java:97)
at Decrypt.main(Decrypt.java:62)
其中,加密使用的模块如下:
public static byte[] encryptData(byte[] data, PublicKey publicKey) {
try {
Cipher cipher = Cipher.getInstance(RSA);
// 编码前设定编码方式及密钥
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
// 传入编码数据并返回编码结果
return cipher.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
解密使用的模块如下:
public static byte[] decryptData(byte[] encryptedData, PrivateKey privateKey) {
try {
Cipher cipher = Cipher.getInstance(RSA);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(encryptedData);
} catch (Exception e) {
e.printStackTrace();
//System.out.println(e.printStackTrace());
return null;
}
}
解密过程使用了 BC 模块来读取 pem 格式( pkcs8 )的私钥文件(加解密过程中均使用了同一模块进行 Base64 操作),调用解密的代码如下:
KeyFactory factory = KeyFactory.getInstance("RSA", "BC");
PrivateKey privateKey = generatePrivateKey(factory, "private_key.pem");
String encryptContent = "xxxxx";
byte[] decryptByte = RSAUtils.decryptData(Base64Utils.decode(encryptContent), privateKey);
String decryptStr = new String(decryptByte);
System.out.println(decryptStr);
已经谷歌了一下,但是没有找到合适的办法,不知哪位有接触过这个,希望不吝赐教,感谢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.