在客户端(移动终端),我使用CryptoJS加密用户密码:
var lib_crypt = require('aes');
$.loginButton.addEventListener('click', function(e){
var key = lib_crypt.CryptoJS.enc.Hex.parse('bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3');
var iv = lib_crypt.CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
var encrypted = lib_crypt.CryptoJS.AES.encrypt($.passwordInput.value, key, { iv: iv });
var password_base64 = encrypted.ciphertext.toString(lib_crypt.CryptoJS.enc.Base64);
return password_base64;
});
在服务器端,我想用mcrypt_decrypt解密它:
function decryptPassword($password)
{
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
$ciphertext_dec = base64_decode($password);
$iv_dec = "101112131415161718191a1b1c1d1e1f";
$ciphertext_dec = substr($ciphertext_dec, 16);
$decryptedPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
return trim($decryptedPassword);
}
我用的是同一个键和IV,我做错了什么?
4条答案
按热度按时间50few1ms1#
你在两边做的不是同一件事。
四
你确实在CryptoJS中解析了IV,但忘记在PHP中这样做了:
要修复IV错误,您可能会注意到前16个字节是乱码。当IV错误时会发生这种情况。请注意,CryptoJS默认使用CBC模式,因此IV在解密过程中只对第一个块有影响。删除这个:
填充
你可能已经注意到了,大多数明文都不正确。它们以一些奇怪的重复字符结尾。这是CryptoJS中默认应用的PKCS#7填充。你必须在PHP中自己删除填充。好消息是Maarten Bodewes为这个here提供了一个合适的复制粘贴解决方案。
trim()
可能适用于ZeroPadding,但当使用PKCS#7中定义的适当填充方案时则不适用。您可以完全删除trim()
调用,因为它没有用处,并且可能导致意外的纯文本,因为零字节和空白从开始到结束都被修剪。8hhllhi22#
如果您没有在JS部分发送
iv
设置,并且使用默认设置进行设置,则PHP函数如下所示。Js段
PHP部分
e1xvtsh33#
你好啊
为了实现这一点,应该考虑使用的关键和iv与32十六进制数字,每个,我必须解决正是这个做我的东西,这里是它的方式
现在用PHP接收和解密
有了这个,我们将有回“嗨,这将是看到解密后”:)
b1uwtaje4#
以下是基于此注解的解决方案,使用PHP中的
openssl_decrypt
。JavaScript部分(使用浏览器的NodeJS开发)-首先,使用
npm install crypto-js
安装CryptoJS,然后安装JS代码:在PHP端,您的代码将如下所示: