2016-09-15 56 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));