关于RSA+AES加密(如何在PHP中解密AES)

Lime
  • 14

今天我尝试通过RSA+AES方法来加密传输用户提交的密码,我已经完成了前端JS的编写(代码如下,并附一次运行结果截图,AES,RSA加密的值是会更变的),它使用了两个库,分别是jsencryptcrypto-js,现在,我正在编写后端解密的PHP(代码如下),但是在这过程中我遇到了一点困难,RSA解密部分已经编写完毕并测试无误,但是我不懂得如何编写AES解密部分,即使我已经查阅了许多的资料,他们的例子与我有一些不同,我不懂得如何去使用它(文末我会附上一些例子)。
问题:
1,请问我的JS加密部分是否正确并符合逻辑;
2,请问我应该如何编写PHP AES解密部分;
3,请问我的思路是否正确?
客户端(JavaScript):
AES 加密 原始用户密码
RSA 公钥 加密 AES秘钥
---数据传输---
服务端(PHP):
RSA 私钥 解密 获得 AES秘钥
AES 解密 获得 原始用户密码
再通过加密 原始用户密码 获得 加密用户密码 存储到 数据库 中
我的JavaScript代码:

$(function () {
            //加密部分
            //AES
            var password_form="QAQ";
            console.log(password_form);
            var password = CryptoJS.AES.encrypt(password_form,'Lime Website').toString();
            console.log(password);
            //RSA
            var public_key = $("#inputPublic_key").val();
            console.log(public_key);
            var private_key = $("#inputPrivate_key").val();
            console.log(private_key);
            var encrypt = new JSEncrypt();
            encrypt.setPublicKey(public_key);
            var AES_key = encrypt.encrypt(password);
            console.log(AES_key);
            
            //解密部分(实际应由服务端完成,此处为了方便所以写在这)
            //RSA
            var decrypt = new JSEncrypt();
            decrypt.setPrivateKey(private_key);
            var AES_key_decrypt = decrypt.decrypt(AES_key);
            console.log(AES_key_decrypt);
            //AES
            var bytes = CryptoJS.AES.decrypt(AES_key_decrypt,'Lime Website');
            var password_decrypt = bytes.toString(CryptoJS.enc.Utf8);
            console.log(password_decrypt);
        });

我的PHP代码:

<?php
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
-----END RSA PRIVATE KEY-----';
$private_key_public_key_availability = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$AES_key = "iOks+yhKxQBiqtd5rHQRNdXOGqixhNzquuZuPZ5dDsYfh1nDTLiygukiyexNBqHfmA7zis1nRTZW2Nw4bN5Pr2yCgvh1GPV6K5WigO5jD1+ztuyp1hV5ymNSws6EUPPjW9cwrOpO7EIeiYjvGo7ziyPwsCU0vwtQAkNAFY3uhB0=";
$AES_key_decrypted = ""; 
echo "通过解密后数据:";
openssl_private_decrypt(base64_decode($AES_key),$AES_key_decrypted,$private_key_public_key_availability);
echo $AES_key_decrypted;

JavaScript其中一次运行结果的截图:
截图
一些例子:
https://odan.github.io/2017/0...
https://stackoverflow.com/que...
https://stackoverflow.com/que...
最后感谢大家的回答吖QAQ

回复
阅读 1.2k
1 个回答

CryptoJS 在使用 AES 时未指定加密模式时会自动采用方案。

https://stackoverrun.com/cn/q...

解密写法参考

https://github.com/etienne-ma...

在开发过程中,我们始终应该严格的显式的 指定使用的 加密模式填充方式。还应当根据后台语言来调整所使用的填充方式

你知道吗?

宣传栏