使用公钥进行RSA解密

我的Android项目中有一些解密问题。

我收到一个用私钥签名的字符串,我必须用公钥validation(解密)它。 我希望得到与使用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 ,这是一个正确的输出。

Java已经有了Java Cryptography Extension Framework,它就是为这些东西设计的。

BouncyCastle是此框架的加密提供程序。 这意味着,它为您的Java Cryptography Extension提供了加密算法的实现。

您将在java.securityjavax.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加密技术。