php - AES CryptoJS 加密和 phpseclib 解密

标签 php node.js aes phpseclib cryptojs

我还有一个问题
在 Node.js 上我有下一个代码

var iv = CryptoJS.enc.Hex.parse('00000000000000000000000000000000'); //it's for tests, later it will be dynamically generated
var key256Bits = 'A5178B6A965AACF3CD60B07A15061719';

var cipher = CryptoJS.AES.encrypt(
    'Some text', 
    key256Bits, 
    {
        iv: iv,
        padding:CryptoJS.pad.ZeroPadding
    }
).toString();

然后当我尝试使用 phpseclib 对其进行解码时

$key = 'A5178B6A965AACF3CD60B07A15061719';
$data = /*text encrypted by JS*/;
$cipher = new AES();
$cipher->setKeyLength(256);
$cipher->setKey($key);
$res = $cipher->decrypt($data);

然后 $res 变成空字符串
我做错了什么?

最佳答案

如果你传入一个字符串到CryptoJS.<cipher>.encrypt作为 key ,CryptoJS 将其视为密码,并将使用 OpenSSL 的 EVP_BytesToKey 从中派生出实际 key 。使用随机盐和 MD5 的一次迭代。

phpseclib 没有这个实现,所以你可以只传递实际的 key :

var key256Bits = CryptoJS.enc.Utf8.parse('A5178B6A965AACF3CD60B07A15061719');

由于该 key 只有 32 个十六进制长,因此它只有 128 位熵,但仍然使用 AES-256。您需要 64 个十六进制数,您可以在使用前对其进行解码,以获得 32 个字节的安全 key 大小。

此外,phpseclib 实现了 PKCS#7 填充,因此您需要使用

padding: CryptoJS.pad.Pkcs7

在 CryptoJS 中。

JavaScript 代码示例:

var iv = CryptoJS.enc.Hex.parse('00000000000000000000000000000000'); //it's for tests, later it will be dynamically generated
var key256Bits = CryptoJS.enc.Utf8.parse('A5178B6A965AACF3CD60B07A15061719');

var cipher = CryptoJS.AES.encrypt(
    'Some text', 
    key256Bits, 
    {
        iv: iv,
        padding: CryptoJS.pad.Pkcs7
    }
).toString();
console.log(cipher)
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>

在 PHP 中,您需要确保在使用前对密文进行解码:

$data = base64_decode("IWkBG3A46rNrxwWN2JD7xQ==");

$key = 'A5178B6A965AACF3CD60B07A15061719';
$cipher = new AES();
$cipher->setKeyLength(256);
$cipher->setKey($key);
$res = $cipher->decrypt($data);
var_dump($res);
<小时/>

安全考虑:

如果您仅使用对称加密,则服务器和客户端需要完全相同的 key 。如果您将加密 key 从服务器发送到客户端或以其他方式发送加密 key ,则您需要加密对称加密 key 。最简单的方法是使用 TLS。如果您使用 TLS,那么数据和 key 都会被加密,因此您不需要自己加密。这不提供任何安全性,只是有点混淆。您应该阅读:https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/

关于php - AES CryptoJS 加密和 phpseclib 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45531486/

相关文章:

javascript - Ajax - 将按钮值发送到 php

javascript - 单击 RXjs 按钮未得到服务器响应

javascript - 获取超过 100 条消息

php - PDO bindValue with\PDO::PARAM_BOOL 导致语句执行失败

php - 插入cookie并输入值mysqli

php - 在 zend 中在哪里保存自定义自动加载器?

javascript - 如何在 Slack channel 中发送私信?

c++ - linux aes256 带 cbc 加密/解密库

java - 如何使用 AES 在 Java 中加密文件

c# - 指定的初始化向量 (IV) 与该算法的 block 大小不匹配