我写了一个加密或解密单词的函数。 为什么解密密钥与加密密钥不一样?
function cryptage(action, password) {
var method = "AES-256-CBC";
if (action == "encrypt") {
var cipher = crypto.createCipher(method, password)
var crypted = cipher.update(password, 'utf8', 'hex')
crypted += cipher.final('hex');
return crypted;
} else if (action == "decrypt") {
var decipher = crypto.createDecipher(method, password)
decipher.setAutoPadding(false);
var decrypted = decipher.update(password, 'hex', 'utf8')
decrypted += decipher.final('utf8');
return decrypted;
}
}
当我致电var crypted = cryptage("encrypt", "test")
时,会返回
cc1fbd73cb93106c3358636ff619bdbd
当我致电cryptage("decrypt", crypted)
时,它会完全返回
Te ~ IӠ~{} m
但没有文字,为什么?
答案 0 :(得分:2)
TL; DR => R ead T F ine M anual
nodejs crypto模块要求您在通过CreateCipher / CreateDecipher的2参数重载创建Cipher或Decipher实例时提供两件事:一个方法 - 要使用的实际openssl密码的名称和密码,将被送入EVP_BytesToKey,结果将是实际密码实例的密钥字节
使用它的新实现应该不可避免地导致现在对autor的惩罚......它是不安全的,应该用PBKDF2代替......如果你已经阅读了文档,你就会知道这一点。 ..但无论如何......你想知道为什么你的功能没有返回所需的输出......原因很简单......
您提供与密码和数据相同的值,并且在解密时您想提供加密结果......这不起作用
查看简化的加密和解密函数/公式
ENCRYPT(DATA,KEY)=>密文
DECRYPT(CIPHERTEXT,KEY)=> DATA
这非常简单,适用于所有symetric密码(如AES,包括所有操作模式和所有密钥,所以......是的......即使对于密码块链中256位密钥的AES也是如此模式)
那么你的情况是什么?你这样做:
你声明密钥和数据是相同的...
ENCRYPT(KEY,KEY)=>密文
DECRYPT(CIPHERTEXT,CIPHERTEXT)=>垃圾
请注意,为了成功解密,加密和解密函数的关键参数必须是相同的,这对您的案例来说是失败的
因此,对于您的方法,这意味着您需要与解密关键参数相同的原始密码...是...您需要您想要解密的相同值...作为输入.. 。到你的解密功能...