【问题标题】:Porting AES decryption from CryptoJS to Php将 AES 解密从 CryptoJS 移植到 Php
【发布时间】:2015-09-16 02:20:59
【问题描述】:

我正在尝试将 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 时,它给了我奇怪的字符。

【问题讨论】:

  • 定义“奇怪的字符”.
  • 任何不是实际输出的东西。
  • PHP 使用 ASCII,而 Javascript 使用 UTF-8。不同的编码,不是吗?
  • echo $dec; 这说明了什么?
  • jsº—àžd^¶Ï—6OÀÆúË¥îFTqó\°ª=»±Ê%è»5eÝq!M

标签: javascript php encryption aes encryption-symmetric


【解决方案1】:

警告:这是弱密码术

  • 您正在使用具有空字节常量 IV 的 CBC 模式(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() 密钥。


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

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

另外,如果你能avoid using mcrypt,你会发现自己更快乐。

【讨论】:

    【解决方案2】:

    您应该使用 mcrypt 扩展名(这是用 C 实现的),因此您不需要移植 JS 代码。

    http://php.net/manual/en/book.mcrypt.php

    【讨论】:

    • mcrypt 如果我没记错就使用。不完全移植,而是从不同类型的网络表单中查看相同的输出。
    • 那么,有什么问题?
    • 问题是我在底部提到的输出
    • 哦,现在我明白了.. 然后检查参数,也许您也必须使用 base64 等执行步骤.. 实际上不确定,请阅读文档)
    • 我不确定这个答案是否真的能说明这种情况。另外,mcrypt sucks, please stop using it.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2014-03-06
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多