AES CryptoJSencryption和phpseclib解密
我有下一个问题
在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变成一个空string
我做错了什么?
如果传递一个string给CryptoJS.<cipher>.encrypt
作为一个密钥,那么CryptoJS将它视为一个密码,并且将使用OpenSSL的EVP_BytesToKey
以随机salt和一个MD5迭代的方式派生实际的密钥。
phpseclib没有这个实现,所以你可以传入实际的密钥:
var key256Bits = CryptoJS.enc.Utf8.parse('A5178B6A965AACF3CD60B07A15061719');
由于这个密钥长度只有32个,它只有128位的熵,但仍然使用AES-256。 你需要64个hexits,你可以解码之前获得32个字节的安全密钥大小。
此外,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>
- 使用Diffie-Hellman密钥交换和AES进行客户端HTTPencryption
- 解密s3文件卸载使用unload命令与对称密钥encryption
- python(pycrypto)和nodejs(crypto)之间不匹配的encryption(aes-128-cbc)
- 尝试使用crypto-js和nodejs进行解密
- 如何在NodeJS中使用aes-256-ecb正确encryptionstring并使用OpenSSL的命令行解密?
- Java BouncyCastle中的确定性AES-CTR?
- 在NodeJS和C#中AES256encryption/解密
- 解密来自PHP RIJNDAEL_128 CBC的node.js中的string
- 当PassPhrase相同时,需要SJCL做相同的encryption的AES 256输出