2017-07-26 461 views
-5

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

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),它正好返回

特〜IӠ〜{} m

但没有文字,为什么?

+4

我没有审查所有的代码,但如果该函数的第二个参数是'password'你提供不同的值,它永远不能工作 – pedrofb

+4

为了“加密”的东西,你需要一个*秘密*(如密码)和一个明文。你的算法只接受一个值。这*不*是加密,它是一个*编码*最好。 – deceze

+0

没有因为有一个回报,所以只有一个值。 –

回答

2

TL; DR =>ř EAD Ť˚F INE 中号 anual

的的NodeJS密码模块期望用户时可创建用密码或通过破译实例提供两件事情2参数过载CreateCipher/CreateDecipher:一种方法 - 实际使用的openssl密码的名称和一个密码,它将被输入到EVP_BytesToKey中,结果将成为实际密码实例的关键字

一个新的实现使用这个应用程序将不可避免地导致现在对作者的惩罚......这是不安全的,应该由PBKDF2取代......例如,如果你已经阅读文档,你会知道这一点......但无论如何......你想知道为什么你的函数没有返回所需的输出...原因很简单...

你提供了与密码和数据相同的值,并且在解密时想要提供加密结果... this不能工作

看看简化加密和解密功能/式

ENCRYPT(DATA,KEY)=>密文
DECRYPT(密文,KEY)=>数据

这是非常直接的,并且适用于所有对称密码(如AES,包括所有操作模式和所有密钥大小,所以...是...甚至对于256位AES密钥在密码块链模式)

所以你的情况是怎么回事?你这样做:
声明键和数据是相同的...
ENCRYPT(KEY,KEY)=>密文
DECRYPT(密文,密文)=>垃圾

请注意,一个成功的解密的加密密钥参数和解密功能MUST是一样的,它失败了你的情况

所以你的方法,这将意味着,你需要非常相同的原始密码进行解密的关键参数...是的...你需要与你想解密的值相同......作为你的解密函数的输入......