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

发布于 2024-11-17 23:10:54 字数 2130 浏览 4 评论 0原文

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

在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);

然后在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);

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

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

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.

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

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:

$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.

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光沙漏 2024-11-24 23:10:54

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文