使用CryptoJS加密并使用PHP解密

帕波哈

在客户端(移动设备)上,我使用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相同的密钥,我该怎么办?

Artjom B.

您在两方面都没有做相同的事情。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用CryptoJS加密数据并使用AESCipherService解密

使用CryptoJS进行OpenSSL加密-解密

使用phpseclib使用AES进行加密,并使用CryptoJS进行解密

使用PHP加密(openssl_encrypt),然后使用JS解密(CryptoJS)

使用JavaScript加密(cryptojs),使用php openssl解密,无法重新创建消息密钥

使用CryptoJS进行AES加密并使用CodeIgniter进行解密

CryptoJS使用密码对AES进行加密,但PHP解密需要一个密钥

AES-256 CBC加密在Ruby / PHP中成功,但是使用CryptoJS解密失败

使用CryptoJS在javascript中进行AES加密/解密

使用CryptoJS加密,使用PyCrypto解密(将CryptoJS调整为PyCrypto默认值)

用PHP加密;用CryptoJS解密

使用CryptoJS和PHP进行AES加密

使用Nodejs加密并使用PHP解密

使用CryptoJS的AES加密

解密工作使用 PHP (openssl) 而不是使用 javascript (cryptojs)

CryptoJS加密Go解密

加密(cryptojs)-解密(.NET)

使用新的 php 版本加密解密问题

使用Android和PHP加密/解密

使用 R 解密 PHP 中加密的消息

使用CryptoJS解密openssl AES

如何使用CryptoJS加密和如何使用Rust Magic Crypt解密

使用公共密钥加密,以Javascript加密,以PHP解密

使用cryptojs有效地加密/解密大文件

使用CryptoJS在Java中进行AES加密并在JavaScript中进行解密

CryptoJS AES解密用PHP openssl_encrypt加密的消息

使用CryptoJS(JAVASCRIPT)和OpenSSL(PHP)实现相同的加密

如何使用AES使用CryptoJS解密?

CryptoJs解密功能的加密功能