我有使用MCRYPT_RIJNDAEL_128,ECB模式和Base64的加密消息,我尝试使用加密(https://www.npmjs.com/package/crypto)使用以下代码进行解密:
var text = '';
var decipher = crypto.createDecipheriv("aes-128-ecb","SOMEKEYHEREWITHLENGTH32ooooooooo", '');
text += decipher.update(data, "base64");
text += decipher.final();
我得到的错误是:密钥长度无效32。
钥匙的长度应该是多少?当我尝试使用16而不是抛出的错误是: ' TypeError:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:bad decrypt'
如果客户要求使用长度为32的密钥的ECB,我该如何使这个案例有效?
答案 0 :(得分:1)
AES是Rijndael的一个子集,固定块大小为128位,而Rijndael支持128,192和256位的块大小。 128
中的MCRYPT_RIJNDAEL_128
表示块大小。另一方面,128
中的aes-128-ecb
表示密钥大小。 AES和Rijndael都支持128,192和256位的密钥大小。
如果你有一个32个字符的密钥并且这个密钥没有经过十六进制编码以达到这32个字符,那么你可能真的想要aes-256-ecb
。
请记住,密钥编码可能与PHP中的不同,因此可能需要将密钥解析为具有特定编码的Buffer
。
此外,请不要使用ECB模式。这是不安全的。您应该至少使用CBC模式和随机IV。由于IV不需要保密,因此您可以将其与密文一起作为前缀发送。然后,您需要在解密之前将其切掉。