为什么我不需要 32 位密钥或 NodeJS 加密的初始化向量?



我曾与Node的crypto库和Ruby的OpenSSL库互换工作。

我遇到的挑战是,我可以在两个库中使用aes256进行加密。

然而,在使用crypto.createDecipher('aes256', key)的节点中,我可能有一个小于32位长的密钥,但ruby在使用时会抛出一个错误,说密钥不够长

cipher = OpenSSL::Cipher.new 'aes256'
cipher.encrypt
key = 'geeses'

我也不必为node设置初始化向量,但ruby似乎在幕后设置了一个。我对加密货币很陌生,这里发生了什么?

虽然@mscdex的答案很完美,但我想补充一下,当您的算法不需要使用crypto.createCipherivcrypto.createDecipheriv 的初始化矢量时,如何使用特定密钥获得密码

以AES-256-ECB为例,其中没有进行链接,因此没有使用IV。您可以将空缓冲区作为IV传递。

    var data = "plaintext";
    const key = crypto.randomBytes(32);
    var iv = new Buffer('');
    var cipher = crypto.createCipheriv('AES-256-ECB',key,iv);
    var encrypted = cipher.update(data,'utf8','base64');
    encrypted += cipheriv.final('base64');
    console.log('encrypted AES-256-ECB',encrypted);

并且使用相同的模式进行解密:

   var decipheriv = crypto.createDecipheriv('AES-256-ECB',key,iv);
   var decryptediv = decipheriv.update(encrypted,'base64','utf8');
   decryptediv += decipheriv.final('utf8');
   console.log('decrypted base64 aes-256 ',decryptediv);

使用crypto.createDecipher()时,作为第二个参数传递的值是一个密码,密钥和IV将从该密码派生(使用MD5哈希的一次迭代)。这是通过使用EVP_BytesToKey()来创建这两个值来实现的。OpenSSL知道两个值需要的正确长度,因为密码也传递给EVP_BytesToKey()

因此,Ruby函数很可能更类似于节点的crypto.createDecipheriv(),它接受密钥和IV(这需要是密码的正确长度)。

最新更新