2012-12-30 93 views
2

我使用EncryptStringToBytes_Aes方法從MSDN加密使用自定義密碼這樣一些數據:如何使用JavaScript解密AesCryptoServiceProvider?

string original = "some data to encrypt"; 
byte[] encrypted; 

using (AesManaged aes = new AesManaged()) 
{ 
    // Prepare new Key and IV. 
    string passphrase = "somepassphrase"; 
    byte[] saltArray = Encoding.ASCII.GetBytes("somesalt"); 
    Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(passphrase, saltArray); 
    aes.Key = rfcKey.GetBytes(aes.KeySize/8); 
    aes.IV = rfcKey.GetBytes(aes.BlockSize/8); 

    // Encrypt the string to an array of bytes. 
    encrypted = EncryptStringToBytes_Aes(original, aes.Key, aes.IV); 

    // Decrypt the bytes to a string. 
    string roundtrip = DecryptStringFromBytes_Aes(encrypted, aes.Key, aes.IV); 

    return Convert.ToBase64String(encrypted); 
} 

和它的作品(DecryptStringFromBytes_Aes返回原始字符串)。

我的問題是我如何使用JavaScript解密encrypted,如果我在客戶端也有相同的密碼短語?我嘗試使用CryptoJS來解密它,但沒有成功。數據在web服務中得到加密,我嘗試將它作爲字節數組,字符串傳遞給JS,嘗試使用各種編碼進行編碼,但無論我做了什麼,我都無法獲取原始字符串。我在這裏做錯了什麼,我該如何做這項工作?它甚至可以這樣做嗎? saltArray編碼甚至自定義密碼的使用是否可以解決我的問題?

這裏是例如我的JS嘗試(使用base64編碼)之一:

var decoded = CryptoJS.enc.Base64.parse(encrypted); 
var decrypted = CryptoJS.AES.decrypt(decoded, "somepassphrase"); 

(編輯:我的意思是以後實施隨機鹽,一旦我得到了一切工作呢,因爲它更容易追蹤這是怎麼回事)

+2

你濫用CBC總是使用相同的IV。 IV應該是一個隨機字節序列,不應該被重複使用。 – SLaks

+0

@SLaks - 使用隨機鹽會每次給我不同的IV,這就是你正在嘗試的,對吧?我的意思是稍後實施隨機鹽,一旦一切正常。 – pootzko

+1

正確。您將需要隨每條消息一起傳送IV。 (IV不需要保密) – SLaks

回答

相關問題