为什么解密密钥与加密密钥不一样?

时间:2017-07-26 10:28:13

标签: javascript node.js encryption cryptography

我写了一个加密或解密单词的函数。 为什么解密密钥与加密密钥不一样?

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

但没有文字,为什么?

1 个答案:

答案 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)=>垃圾

请注意,为了成功解密,加密和解密函数的关键参数必须是相同的,这对您的案例来说是失败的

因此,对于您的方法,这意味着您需要与解密关键参数相同的原始密码...是...您需要您想要解密的相同值...作为输入.. 。到你的解密功能...