gpt4 book ai didi

javascript - 将 AES 解密从 CryptoJS 移植到 Php

转载 作者:行者123 更新时间:2023-11-30 08:34:50 25 4
gpt4 key购买 nike

我正在尝试将 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);

在我试过的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");

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

最佳答案

警告:这是弱加密

  • 您使用的 CBC 模式具有空字节的常量 IV(应为每条消息随机生成 IV)。
  • 你是 not authenticating your ciphertext .
  • 天真的使用 rtrim() 会将您的应用程序暴露给 padding oracle attacks ,如果您遵循 Encrypt Then MAC 构造,这将不是问题。

代码中的实际错误

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

这不是这个函数的用途。

string mcrypt_create_iv(int $length, int $source);

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

您也没有 base64_decode() key 。


我真的希望您没有在任何地方部署此代码。

推荐阅读:Write crypto code! Don't publish it!作者:Talyor Hornby。

此外,如果可以的话avoid using mcrypt ,你会发现自己更快乐。

关于javascript - 将 AES 解密从 CryptoJS 移植到 Php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com