NodeJS:createCipheriv 应该提供与之前的 createCipher 相同的输出

NodeJS: createCipheriv should give same output like earlier createCipher

目前,我正在使用旧版本的crypto.js来加密和解密字符串。
下面是我的加密代码 -

const encrypt = (password, algorithm, encMethod) => (value) => {
  const cipher = crypto.createCipher(algorithm, password);
  return cipher.update(JSON.stringify(value), 'utf8', encMethod)
    + cipher.final(encMethod);
};

使用上面的代码我的字符串 (E-mailID)
p1@yopmail.com 被转换为
29c68f3bad0068c44122e734367f64557112e058c8222e3fd3908e68402ce6d5

现在 createCipher 已弃用,我应该如何处理 createCipheriv 以提供与上面相同的输出。

我试图将 null 作为 IV 传递给函数 createCipheriv,但我得到了错误 Missing IV for cipher aes-256-cbc-hmac-sha1

是的,最后我使用下面的一些技巧解决了同样的问题 -

const bytesToKey = require('evp_bytestokey');

const encryptionToken = bytesToKey(SomePasswordString, null, 256, 16);


//Ciphering 
const cipher = crypto.createCipheriv('aes-256-cbc-hmac-sha1', encryptionToken.key, encryptionToken.iv);
return cipher.update(JSON.stringify(##VALUEtoENCRYPT##), 'utf8', 'hex') + cipher.final('hex');


//De-Ciphering 
const decipher = crypto.createDecipheriv('aes-256-cbc-hmac-sha1', encryptionToken.key, encryptionToken.iv);
return JSON.parse(decipher.update(##VALUEtoDECRYPT##, 'hex', 'utf8') + decipher.final('utf8'));

感谢 @topaco 建议我使用 NPM 包 evp_bytestokey

不确定这是否是正确/好的方法,我们可以每次使用相同的 keyiv 到 return 相同的加密和解密值。如果您没有考虑 keyiv,您可以尝试使用 0 填充缓冲区作为 keyiv.

var crypto = require('crypto');
var algo = 'aes-256-ctr';
var key = Buffer.alloc(32);
key.fill(0);
var iv = Buffer.alloc(16);
iv.fill(0);

const encrypt = (text) => {
    var cipher = crypto.createCipheriv(algo, key, iv);
    var crypted = cipher.update(text, 'utf8', 'base64');
    crypted += cipher.final('base64');
    return crypted
};

const decrypt = (text) => {
    var decipher = crypto.createDecipheriv(algo, key, iv);
    var crypted = decipher.update(text, 'base64', 'utf8');
    crypted += decipher.final('utf8');
    return crypted;
};

var encrypted = encrypt('yourpassword'); 
console.log(encrypted); //pfq1CtIh+vraJ9Bw
var decrypted = decrypt('pfq1CtIh+vraJ9Bw');
console.log(decrypted); //yourpassword