2013-07-28 123 views
1

我已使用此OpenSSL的命令而建立的加密的消息:解密AES-256-CBC(鹽醃)密文的Javascript

openssl enc -aes-256-cbc -salt -in plaintext.txt -out cipher.enc 

我試圖CryptoJS和this aes library解密它下面的實施例。我所有的都是胡言亂語。我的問題是解密失敗,因爲我不知道如何告訴javascript解密密碼是鹽漬的還是因爲它在「cbc-mode」中。 CryptoJS看起來更加靈活,所以它可能工作得很好。但是我應該給它提供什麼樣的參數?

注:這是在瀏覽器中運行,而不是在node.js中

+0

一種密碼並不需要鹽; '-salt'參數僅適用於基於密碼的密鑰派生。 CBC模式下的密碼需要一個密鑰和一個初始化向量。您需要將'-K'和'-iv'參數傳遞給OpenSSL(或者,如果您想使用基於密碼的加密,則使用'-pass'參數;但是,您可能很難找到適用的密鑰導出函數)。無論哪種方式,在您繼續之前,請閱讀以下內容:http://www.matasano.com/articles/javascript-cryptography/ – ntoskrnl

+0

閱讀[本頁](http://www.matasano.com/articles/javascript-密碼學/)的一些建議,爲什麼加密在瀏覽器JavaScript是一個壞主意。 –

+1

在這種情況下,其實瀏覽器在我的PhoneGap/Cordova應用程序中。所以至少不是所有這些危險都應該適用。 – auramo

回答

1

我把「消息」在文件中使用:

echo -n "Message" > plaintext.txt 

然後我用你的榜樣,並且作爲password我的密碼

openssl enc -aes-256-cbc -salt -in plaintextut cipher.enc 
enter aes-256-cbc encryption password: 
Verifying - enter aes-256-cbc encryption password: 

然後我需要的cipher.enc

的Base64編碼版本
cat cipher.enc | base64 
U2FsdGVkX1/oA4O+uXXBXAjAenRJwpUV4UqQp4aYCpk= 

最後,這是對我工作的CryptoJS:

var dec = CryptoJS.AES.decrypt("U2FsdGVkX1/oA4O+uXXBXAjAenRJwpUV4UqQp4aYCpk=", "password"); 
var plaintext = CryptoJS.enc.Latin1.stringify(dec); 
+0

謝謝!看起來我錯過了一個base64-ifying的步驟。我從Dropbox中讀取加密文件,因此我必須使用Javascript將密碼編碼爲base64。但這不應該成爲一個問題,我會在今天晚些時候嘗試。 – auramo

+0

跑進這個令人討厭的CryptoJS錯誤:https://code.google.com/p/crypto-js/issues/detail?id=38&can=1&q=openssl%20base64用了一段時間,我的頭撞到了牆上。意外Latin1 UTF8數據解碼產生的第一個幾個字正確(不像UTF8解碼剛崩潰),然後纔開始看起來很奇怪。最後,我只需在解密之前從加密的base64數據中刪除換行符並開始工作。呼。 – auramo

+0

也得到加密工作,爭取斯堪的納維亞字符的年齡(他們得到編碼錯誤)。這個meta標籤在我的html中修正了它:。還必須將加密的base64分割爲64個char字符,以便openssl能夠讀取輸出。 – auramo