我想解密我的Android應用程序中使用我的設備上生成的RSA密鑰的字符串。加密由php服務完成,使用我的應用程序提供的公共rsa密鑰。我的問題是解密,失敗。Android RSA解密(失敗)/服務器端加密(openssl_public_encrypt)
我做了以下內容:
生成密鑰對在Android(與KeyPairGenerator.getInstance( 「RSA」)) - >確定
兩個密鑰(公鑰和私鑰)保存到用Base64.encode(pubKey.getEncoded())編碼後的文件和用私鑰相同的文件。 - >確定
當我打電話給我的web服務,我通過在變量後我的公鑰(在基地64) - >確定
Web服務(PHP服務),使用公鑰使用openssl_public_encrypt函數對短字符串進行加密。加密的字符串被轉換爲base64。 - >看起來好,函數不返回FALSE。
應用程序檢索該服務的結果,並對其進行解碼(Base64.decode()) - >行(I已經檢查中,接收到的字節與由openssl_public_encrypt()函數生成的一個原因)
最後一件事是解密這個字符串,我正在做以下事情: - >不是OK
Cipher cipher = Cipher.getInstance(「RSA」);
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte [] decryptedBytes = cipher.doFinal(cryptedBytes);
String decryptedString = new String(decryptedBytes);
System.out.println(decryptedString);
解密的結果與我的原始字符串不匹配。
我錯過了什麼?
'密碼。getInstance(「RSA」)默認爲「教科書RSA」 - 沒有填充 - 根本不安全。我不知道PHP代碼使用了什麼樣的填充,因爲您沒有顯示它,但是您應該在兩端將其更改爲OAEP。 – ntoskrnl
@ntoskrnl你可以把它變成我猜的答案。請注意,默認的「RSA/NONE/NoPadding」僅適用於Bouncy Castle,Java SE - 或更準確地說,Sun JCE - 默認爲「RSA/ECB/PKCS1Padding」。 –
@owlstead好點 - 也說明了顯式聲明模式的重要性,而不是依賴實現之間不同的默認值。 – ntoskrnl