我加密/解密如下消息:加密字符串 -> base64 编码字节 -> 序列化字符串 -> 反序列化字符串 -> 解码 b64 -> 解密字节。
加密看起来像这样:
PublicKey pubKey = readPublicKey();
Cipher cipher;
cipher = Cipher.getInstance(CRYPTO_ALG);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherData;
cipherData = cipher.doFinal(message.getBytes());
return cipherData;
解密是这样完成的:
PrivateKey pk = readPrivateKey();
Cipher cipher = Cipher.getInstance(CRYPTO_ALG);
cipher.init(Cipher.DECRYPT_MODE, pk);
return new String(cipher.doFinal(data));
密钥是这样读取的:
ObjectInputStream oin =
new ObjectInputStream(new BufferedInputStream(is));
BigInteger m = (BigInteger) oin.readObject();
BigInteger e = (BigInteger) oin.readObject();
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PrivateKey privKey = fact.generatePrivate(keySpec);
return privKey;
我在这里省略了 b64 的东西,但我已经验证问题不会影响该代码。
现在发生的事情是我实际上得到了正确的答案,但它前面带有二进制乱码。如果我加密“TESTDATA”,我将得到 TESTDATA。该代码在纯 Java 中运行良好,但在 Android 中失败。有谁知道如何解决这一问题?
编辑:使用 RSA/NONE/NoPadding 加密/解密似乎没有帮助。我还在普通的 JRE 中使用 org.bouncycastle。