我的Android項目中有一些解密問題。用公鑰解密RSA
我得到一個用私鑰簽名的字符串,我必須用公鑰驗證(解密)它。 我想獲得完全相同的結果,如果我用一個PHP函數 - openssl_public_decrypt(http://php.net/manual/pl/function.openssl-public-decrypt.php)
我必須做這在我的Java項目,這樣我就可以使用Java庫(如BouncyCastle的,什麼否則,有什麼建議?)
任何想法如何解決這個問題?
好的,這是我的代碼。 我得到的公鑰這樣
PEMReader reader = new PEMReader(new InputStreamReader(ctx
.getAssets().open("pubkey.pem")));
Object obj;
while ((obj = reader.readObject()) != null) {
if (obj instanceof RSAPublicKey) {
pubKey = (RSAPublicKey) obj;
return pubKey;
}
}
,我總是得到沒有任何問題的公鑰。
Cipher c = Cipher.getInstance("RSA/NONE/NoPadding", "SC");
c.init(Cipher.DECRYPT_MODE, pubKey);
byte[] result = c.doFinal(data_to_decrypt.getBytes());
而作爲一個結果(字節轉換爲字符串之後)我得到022c06571c6a263b389fcd93159cb311abb880bddf51b7c916dd1ae...
其中PHP函數返回 sd8dsa348acvcx87|00454|OK|15000|CDE
,這是一個正確的輸出。
在公鑰加密中:你使用私鑰簽名和解密/解密;您使用公鑰驗證(簽名)並加密/加密。你想要做什麼? – Bruno 2012-04-26 11:09:49
就像我說的我想用公鑰解密數據 – Mike 2012-04-26 11:12:53
你*不能*用公鑰解密數據,它沒有任何意義(儘管PHP的命名選擇很差)。 「*我得到一個用私鑰加密的字符串*」:這實際上沒有意義。它最好籤名。當然,使用RSA它或多或少會有相同的操作(但對於DSA來說情況並非如此)。問題在於消息的簽名幾乎肯定會涉及散列,因此獲得原始消息是不可能的。 – Bruno 2012-04-26 11:15:40