在客户端(移动设备)上,我使用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相同的密钥,我该怎么办?
您在两方面都没有做相同的事情。
您确实在CryptoJS中解析了IV,但是忘记了在PHP中这样做:
$iv_dec = pack('H*', "101112131415161718191a1b1c1d1e1f");
要修复IV错误,您可能已经注意到前16个字节是乱码。当IV错误时就会发生这种情况。请注意,CryptoJS默认情况下使用CBC模式,因此IV仅在解密期间影响第一个块。删除此:
$ciphertext_dec = substr($ciphertext_dec, 16);
您可能已经注意到,大多数纯文本都不正确。他们最后以一些奇怪的重复字符结尾。这是默认在CryptoJS中应用的PKCS#7填充。您必须自己在PHP中删除填充。好事是,马腾Bodewes已经提供了这个正确的复制粘贴的解决方案在这里。
trim()
可能适用于ZeroPadding,但不适用于诸如PKCS#7中定义的适当填充方案时。您可能会trim()
完全删除该调用,因为它没有用,并且可能会导致意外的纯文本,因为从头到尾修剪了零字节和空白。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句