2013-03-18 102 views
0

我與AES在C#這樣加密的字符串:解密AES加密在C#中使用加密的js

public static byte[] KeyFromString(string key, int keyBits)// keyBits is 128, 192, or 256. 
{ 
    byte[] keyBinary = Encoding.UTF8.GetBytes(key); 
    byte[] b = new byte[keyBits/8]; 
    for (int i = 0, j = 0; i < b.Length && j < keyBinary.Length; i++, j++) 
    { 
     b[i] = keyBinary[j]; 
    } 
    return b; 
} 

public static string encrypt(string key, string input) 
{ 
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); 
    byte[] keyBytes = KeyFromString(key, 256); 
    byte[] encrypted = null; 

    using (RijndaelManaged rijAlg = new RijndaelManaged()) 
    { 
     rijAlg.Mode = CipherMode.CBC; 
     rijAlg.Padding = PaddingMode.PKCS7; 
     rijAlg.KeySize = 256; 

     rijAlg.Key = keyBytes; 
     rijAlg.IV = new byte[rijAlg.IV.Length]; //use empty IV 

     using(var encryptor = rijAlg.CreateEncryptor()) 
     { 
      encrypted = encryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length); 
     } 
    } 

    var res = Convert.ToBase64String(encrypted); 
    return res; 
} 

我想解密的javascript加密的文本,我tryed與加密JS:

var iv = []; 
for (var i = 0 ; i < 16 ; i++) iv.push(0); //empty IV 
var options = { keySize: 256/8, mode: CryptoJS.mode.CBC, iv: iv, padding: CryptoJS.pad.Pkcs7 }; 
var decrypted = CryptoJS.AES.decrypt(cipheredtext, key, options); 
var decryptedText = decrypted.toString(CryptoJS.enc.Utf8); 

我得到的解密文本是空的。我試着在編碼多變化,按鍵大小等

我可以用其他JavaScript如果需要

回答

1

也許CryptoJS文檔不提這足夠明確圖書館,但爲了供你選擇的加密算法(AES在你的情況下)使用你提供的確切的鍵和IV,它們必須作爲CJS類型的WordArray傳入。得到了這個詞陣列

一種方法是使用你選擇的編碼解析方法:

var iv = CryptoJS.enc.Hex.parse("HEX ENCODING OF THE KEY"); 
var key = CryptoJS.enc.Hex.parse("HEX ENCODING OF THE IV"); 

,你要做的應該正常工作。

希望有人發現這個有用我花了一段時間才弄明白了幾天前。