gpt4 book ai didi

javascript - Crypto-js 本地端到 php 服务器端

转载 作者:行者123 更新时间:2023-12-03 23:44:19 24 4
gpt4 key购买 nike

我有一个使用 crypto-Js AES 的应用程序。模拟工作代码为:

var ciphertext = CryptoJS.AES.encrypt('My_message', 'My_secret_key');
console.log(ciphertext.toString());

答案是:

U2FsdGVkX1/Dd3uAr/mdw5lVoBvq0UX5LHnNoX24JAM=

当我尝试在服务器端重现它时,我从来没有得到相同的答案:

$passphrase='My_secret_key';
$value='My_message';
$salt = openssl_random_pseudo_bytes(8);
$salt ='';
$salted = '';
$dx = '';
while (strlen($salted) < 48) {
$dx = md5($dx.$passphrase.$salt, true);
$salted .= $dx;
}
$key = substr($salted, 0, 32);
$iv = substr($salted, 32,16);
$encrypted_data = openssl_encrypt($value, 'aes-256-cbc', $key, true, $iv);
echo base64_encode($encrypted_data);

服务器端回答:

3jSTl1yR55lfTbz7f0o3Yw==

我一定错过了什么,但不能指出是什么。本地端不能碰。欢迎所有帮助

最佳答案

如果 CryptoJS.AES.encrypt 中的第二个参数作为字符串传递,它被解释为密码短语,实际 key 和 IV 从中导出,[1] .这是通过使用迭代计数为 1 的 OpenSSL 函数 EVP_BytesToKey 和 MD5 摘要 [2] 的功能来实现的。 [3] (请注意,CryptoJS 不考虑从 OpenSSL 版本 1.1.0c 将默认摘要从 MD5 切换到 SHA256,[4])。

CryptoJS.AES.encrypt 返回一个 CipherParams 对象,它封装了密文、 key 、IV 和盐,[5] .此外,CipherParams#toString() 以 Base64 编码字符串的形式返回 OpenSSL 格式的结果。 OpenSSL 格式由一个 16 字节的 header 和随后的密文组成。 header 以 ASCII 编码的字符串 Salted__ 开头,后跟一个 8 字节的盐。 salt 每次随机生成,并与密码一起用于派生 key /IV。这每次都会创建一个不同的 key /IV。

PHP 代码在功能上是相同的: key 和 IV 是从密码短语中每次使用新生成的盐的模拟逻辑导出的(有关证明,请参见下文)。然而,一些小的改变是必要的:

  • 必须删除以下行:$salt ='';

  • 在目前的代码中,只显示Base64编码的密文。对于 OpenSSL 格式的 Base64 编码结果输出,代码必须改为:

    echo base64_encode('Salted__'.$salt.$encrypted_data); 
  • openssl_encrypt 中的第 4 个参数应从 true 更改为 OPENSSL_RAW_DATA。两者在功能上完全相同,但 OPENSSL_RAW_DATA 的使用更加透明。

JavaScript 和 PHP 代码每次都会生成新的盐,从而生成不同的 key 和 IV,每次都会更改密文。事情本该如此。由于盐与密文存储在一起,因此可以随时使用密码短语解密密文。

证明两个代码使用相同的逻辑来派生 key 和 IV:每次生成的新盐/密文防止直接比较两个代码的结果。为了毫不费力地执行此比较,最好在 PHP 代码中也使用 JavaScript 代码中生成的盐。 JavaScript 代码中的盐可以确定为十六进制字符串:

console.log(ciphertext.salt.toString(CryptoJS.enc.Hex)); 

此盐将用于 PHP 代码中,而不是随机生成的盐(当然仅用于这一次比较):

$salt = hex2bin('<Salt from JavaScript-Code as hexadecimal string>'); 

两个输出的比较现在证明它们是相等的,表明两个代码在功能上是相同的。

关于javascript - Crypto-js 本地端到 php 服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59200048/

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