我加密/解密如下消息: 加密字符串 - > base64編碼字節 - >序列化字符串 - >反序列化字符串 - >解碼b64 - >解密字節。使用RSA的解密結果在普通Java和Android中有所不同
加密看起來是這樣的:
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。
這可以幫助嗎? http://stackoverflow.com/questions/10306560/android-jvm-difference-in-rsa-decryption –
http://stackoverflow.com/questions/7787328/rsa-encrypt-and-crypt-strings-on-android –
@Milos:這似乎很合理,但是當我使用「RSA/NONE/NoPadding」進行加密/解密時,它不起作用。輸出結果都是亂碼。我錯過了什麼嗎?產生密鑰時,我是否必須改變某些內容? – navlelo