Java中的RSA加密,PHP中的解密

时间:2020-12-31 18:33:41

I am trying to encrypt an AES key with an RSA public key in and Android app and then decrypt the AES key on a server using PHP with phpseclib. I have tested to make sure that the RSA encryption/decryption work on both platforms by encrypting a static text and decrypting it afterwards to check if I still get the original text. According to the test, the RSA code works individually on each platform but there seems to be a difference between the platforms.

我正在尝试使用RSA公钥和Android应用程序加密AES密钥,然后使用带有phpseclib的PHP在服务器上解密AES密钥。我已经测试过确保RSA加密/解密在两个平台上都可以通过加密静态文本并在之后解密来检查我是否仍然获得原始文本。根据测试,RSA代码在每个平台上单独工作,但平台之间似乎存在差异。

In Java, I am using the Bouncy Castle library and have the following code:

在Java中,我使用的是Bouncy Castle库并具有以下代码:

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(
new BigInteger("00c897f9e401819e223ffbecc6f715a8d84dce9022762e0e2d54fa434787fcaf230d28bd0c3b6b39b5211f74ffc4871c421362ccfc07ae98b88fa9728f1e26b8210ebbf4981e45867fe810938294d0095d341b646b86dcbd4c246676c203cb1584d01eef0635299714d94fa12933ecd35e6c412573156d9e6e549b7804eb6e165660507d8748bcc8c60da10099bacb94d3f7b50b1883ee108489e0dd97ed7d28e564edd4ee5d6b4225f5c23cdaaf495c3fa08c3b82e1674946e4fa1e79b2493204d6953c261105ba5d0f8dcf3fcd39a51fbc18a5f58ffff169b1bed7ceeded2ae0e8e8e2238e8b77b324d1a482593b1a642e688c860e90d5a3de8515caf384133b", 16),
new BigInteger("11", 16));
keyFactory = KeyFactory.getInstance("RSA", "BC");
//RSAPublicKeySpec rsaKeySpec = new RSAPublicKeySpec(rsaKey.MODULUS, new BigInteger("11", 16));
RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec);  

//Set up the cipher to RSA encryption
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);

// make sure the Aes Key is less than a block size
// otherwise major errors will occur
if(AesKey.length * 8 > pubKey.getModulus().bitLength())
    return "Error: AesKey bigger than block size of RSA Key";

byte[] encryptedKey = cipher.doFinal(AesKey);

// return result Base64 encoded
return Base64.encodeToString(encryptedKey, Base64.DEFAULT);

Then in the PHP, I am using the following code to decrypt the AES key:

然后在PHP中,我使用以下代码来解密AES密钥:

$AESkey = base64_decode($AES);

$rsa = new Crypt_RSA();
$private = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/PrivateData/private_key.pem');
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey($private);
$AESkey = $rsa->decrypt($AESkey);

When the AES key is being decrypted by the server, I always get the following error: Decryption error in C:\xampp\php\PEAR\phpseclib\Crypt\RSA.php on line 1911. Looking at the code in RSA.php, I think the error has something to do with incorrect padding during encryption but I can't seem to figure out a way to fix it.

当服务器解密AES密钥时,我总是会收到以下错误:第1911行的C:\ xampp \ php \ PEAR \ phpseclib \ Crypt \ RSA.php中的解密错误。查看RSA.php中的代码,我认为错误与加密过程中不正确的填充有关,但我似乎无法找到解决方法。

Update: I figured out that the above encryption/decryption code is actually correct. The problem I was having was that I did not url encode the output before sending the data from the app to the php so some of the info was being lost.

更新:我发现上述加密/解密代码实际上是正确的。我遇到的问题是,在将数据从应用程序发送到php之前,我没有对输出进行url编码,因此部分信息丢失了。

1 个解决方案

#1


0  

Which version of phpseclib are you using? Depending on the version the following may help:

您使用的是哪个版本的phpseclib?根据版本,以下内容可能有所帮助:

http://www.frostjedi.com/phpbb/viewtopic.php?p=118414#p118414

http://www.frostjedi.com/phpbb/viewtopic.php?p=118414#p118414

#1


0  

Which version of phpseclib are you using? Depending on the version the following may help:

您使用的是哪个版本的phpseclib?根据版本,以下内容可能有所帮助:

http://www.frostjedi.com/phpbb/viewtopic.php?p=118414#p118414

http://www.frostjedi.com/phpbb/viewtopic.php?p=118414#p118414