我还有一个问题
在 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/