2017-07-26 258 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是一樣的,它失敗了你的情況

所以你的方法,這將意味着,你需要非常相同的原始密碼進行解密的關鍵參數...是的...你需要與你想解密的值相同......作爲你的解密函數的輸入......