我的Android项目中有一些解密问题。
我收到一个用私钥签名的字符串,我必须用公钥验证(解密)它。 我希望获得与使用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
这是正确的输出。
答案 0 :(得分:5)
Java已经有了Java Cryptography Extension Framework,它就是为这些东西设计的。
BouncyCastle是此框架的加密提供程序。这意味着,它为您的Java Cryptography Extension提供了加密算法的实现。
您可以在包java.security
和javax.crypto
要使用公钥解密您的邮件,您可以尝试以下操作:
// Use RSA/NONE/NoPadding as algorithm and BouncyCastle as crypto provider
Cipher asymmetricCipher = Cipher.getInstance("RSA/NONE/NoPadding", "BC");
// asume, that publicKeyBytes contains a byte array representing
// your public key
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance(publicKeySpec.getFormat());
Key key = keyFactory.generatePublic(publicKeySpec);
// initialize your cipher
asymmetricCipher.init(Cipher.DECRYPT_MODE, key);
// asuming, cipherText is a byte array containing your encrypted message
byte[] plainText = asymmetricCipher.doFinal(cipherText);
请注意,此示例基本非常,缺少多个try catch块。此外,您不应使用不带填充的非对称密码,因为这会使您容易受到重放攻击。您可能还会遇到密钥长度问题。在某些Java包中,限制了允许的最大密钥长度。这可以通过使用无限强度策略文件来解决。
我希望,这可以帮助您开始使用Java加密技术。