今天我尝试通过RSA+AES方法来加密传输用户提交的密码,我已经完成了前端JS的编写(代码如下,并附一次运行结果截图,AES,RSA加密的值是会更变的),它使用了两个库,分别是jsencrypt和crypto-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
CryptoJS 在使用 AES 时未指定加密模式时会自动采用方案。
https://stackoverrun.com/cn/q...
解密写法参考
https://github.com/etienne-ma...
在开发过程中,我们始终应该
严格的
、显式的
指定使用的加密模式
、填充方式
。还应当根据后台语言来调整所使用的填充方式