2016-09-15 54 views
0

我在CryptoJS上得不到相同的結果。請問你檢查什麼是錯的?C#中的加密J​​S(CryptoJS)中的解密

這是我期望的輸入/輸出:

Encrypted String: 723024D59CF7801A295F81B9D5BB616E 
Decrypted String: stackoverflow 

這裏是我在C#加密/解密方法。加密是TripleDES模式CBC,我在CryptoJS代碼上使用了相同的密鑰和iv。

public static string Encrypt(string data, string key, string iv) 
{ 
    byte[] bdata = Encoding.ASCII.GetBytes(data); 
    byte[] bkey = HexToBytes(key); 
    byte[] biv = HexToBytes(iv); 

    var stream = new MemoryStream(); 
    var encStream = new CryptoStream(stream, 
     des3.CreateEncryptor(bkey, biv), CryptoStreamMode.Write); 

    encStream.Write(bdata, 0, bdata.Length); 
    encStream.FlushFinalBlock(); 
    encStream.Close(); 

    return BytesToHex(stream.ToArray()); 
} 

public static string Decrypt(string data, string key, string iv) 
{ 
    byte[] bdata = HexToBytes(data); 
    byte[] bkey = HexToBytes(key); 
    byte[] biv = HexToBytes(iv); 

    var stream = new MemoryStream(); 
    var encStream = new CryptoStream(stream, 
     des3.CreateDecryptor(bkey, biv), CryptoStreamMode.Write); 

    encStream.Write(bdata, 0, bdata.Length); 
    encStream.FlushFinalBlock(); 
    encStream.Close(); 

    return Encoding.ASCII.GetString(stream.ToArray()); 
} 

這是我如何做使用CryptoJS

var key = "90033E3984CEF5A659C44BBB47299B4208374FB5DC495C96"; 
var iv = "E6B9AFA7A282A0CA"; 

key = CryptoJS.enc.Hex.parse(key); 
iv = CryptoJS.enc.Hex.parse(iv); 


// Input is a Hex String 
var decrypted = CryptoJS.TripleDES.decrypt('723024D59CF7801A295F81B9D5BB616E', key, { iv : iv, mode:CryptoJS.mode.CBC}); 
console.log(decrypted.toString()); 
+0

嗨,你可以給我HexToBytes函數。什麼是des3對象?你可以以獨立的形式使用這些功能嗎?我必須做同樣的事情,但我是加密部分的新手。 – Sagar

回答

0

CryptoJS解密期望密文是一個CipherParams對象或OpenSSL的編碼的字符串。你已經將密文傳給Hex了。做到這一點,而不是:

var decrypted = CryptoJS.TripleDES.decrypt({ 
    ciphertext: CryptoJS.enc.Hex.parse('723024D59CF7801A295F81B9D5BB616E') 
}, key, { 
    iv : iv, 
    mode:CryptoJS.mode.CBC 
}); 

decrypted現在是一個WordArray對象。對它進行字符串化將導致使用默認編碼Hex的字符串。如果你知道你應該得到文本,你可以使用適當的編碼,如:

console.log(decrypted.toString(CryptoJS.enc.Utf8));