将AES解密从CryptoJS移植到Php

Abu*_*nat 1 javascript php encryption aes encryption-symmetric

我正在尝试将AES解密函数从JavaScript转换为PHP脚本.忽略缩进以便于阅读.

var enc = 'EK/tvL3RsjOY1j82ILXv7W10bEU83JeaiBhlLmcZIrk=';

var key = 'FSHcT+sfRO/siok2ooweuA==' ;

var y = CryptoJS.AES.decrypt({ciphertext:     CryptoJS.enc.Base64.parse(enc)}, 
CryptoJS.enc.Base64.parse(key), 
{iv: CryptoJS.enc.Hex.parse("2323232323232323")});

var dec = y.toString(CryptoJS.enc.Utf8);
Run Code Online (Sandbox Code Playgroud)

在PHP中我试过了

$iv = mcrypt_create_iv(16, '2323232323232323'); 

$enc = 'EK/tvL3RsjOY1j82ILXv7W10bEU83JeaiBhlLmcZIrk=';

$key = 'FSHcT+sfRO/siok2ooweuA==' ;

$dec = rtrim((mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $enc, MCRYPT_MODE_CBC, $iv)), "\0\3");
Run Code Online (Sandbox Code Playgroud)

在Javascript解密工作正常,但当我执行PHP它给我奇怪的字符.

Sco*_*ski 5

警告:这是弱密码学

  • 您正在使用具有恒定IV空字节的CBC模式(应为每个消息随机生成IV).
  • 没有验证您的密文.
  • 天真的使用rtrim()暴露你的应用程序填充oracle攻击,如果你遵循加密然后MAC构造,这不会是一个问题.

您的代码中的实际错误

$iv = mcrypt_create_iv(16, '00000000000000000000000000000000'); 
Run Code Online (Sandbox Code Playgroud)

这不是如何使用这个功能.

string mcrypt_create_iv(int $length, int $source);
Run Code Online (Sandbox Code Playgroud)

例如:mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);将从中生成16个字节的随机数据/dev/urandom.看起来你想str_repeat("\0", 16)在这里,但正如我上面所说,这是一个可怕的想法.

你也没有base64_decode()钥匙.


我真的希望你没有在任何地方部署这个代码.

推荐阅读:编写加密代码!不要发布它!作者:Talyor Hornby.

此外,如果你可以避免使用mcrypt,你会发现自己更快乐.