最近在做一东西 下载文件后 对文件RSA加盟的内容进行解密,但是解密出的文件首尾总是出现乱码,而中间部分正常。
研究了以下发现在java中和Android中RSA解密部分有一点点区别。
解密部分代码如下:
public static byte[] decryptByPublicKeyFile(byte[] dataStr, byte[] pubKey)
throws Exception {
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
int inputLen = dataStr.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(dataStr, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(dataStr, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
}
请注意,其中
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
不能这么写 这一句 在单独Java环境下是没有问题的 解密出来的是没有乱码 但是在Android中这样写 就会产生部分乱码
应该改写为:
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
这样写就OK了