我的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