【问题标题】:Decrypt from AES-ECB ciphertext created with php/mcrypt using node.js使用 node.js 从 php/mcrypt 创建的 AES-ECB 密文中解密
【发布时间】:2015-12-31 05:13:23
【问题描述】:

我有一条使用 MCRYPT_RIJNDAEL_128、ECB 模式和 Base64 的加密消息,我尝试使用带有以下代码的 crypto(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:错误解密'

如果客户需要使用长度为 32 的 ECB,我怎样才能使这种情况有效?

【问题讨论】:

    标签: php node.js encryption aes


    【解决方案1】:

    AES 是 Rijndael 的子集,具有 128 位的固定块大小,而 Rijndael 支持 128、192 和 256 位的块大小。 MCRYPT_RIJNDAEL_128 中的 128 表示块大小。另一方面,aes-128-ecb 中的 128 表示密钥大小。 AES 和 Rijndael 都支持 128、192 和 256 位的密钥大小。

    如果您有一个 32 个字符的密钥,并且该密钥未经过十六进制编码以达到这 32 个字符,那么您可能确实想要aes-256-ecb

    请记住,密钥编码可能与 PHP 中的不同,因此可能需要将密钥解析为具有特定编码的 Buffer


    另外,请不要使用 ECB 模式。这是不安全的。您应该至少使用带有随机 IV 的 CBC 模式。由于 IV 不需要保密,您可以简单地将其与密文一起作为前缀发送。然后,您需要在解密之前将其切掉。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2013-10-21
    相关资源
    最近更新 更多