2013-08-05 52 views
1

我目前在解密CryptoJS中使用長度不是128,192或256位的密鑰的C#中的項目時遇到問題。 CryptoJS允許在加密/解密期間使用「奇數」長度的密鑰,但C#中的對稱算法類(例如RijndaelManaged)不允許這樣做。使用非標準密鑰長度調用CryptoJS.AES.encrypt/decrypt時如何處理AES密鑰?

的Javascript

var key = CryptoJS.enc.Utf8.parse("This key is 160 bits"); // Not 128, 192, or 256 bits, but is allowed 
var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f"); 
var result = CryptoJS.AES.encrypt("Encrypt Me!", key, { iv: iv }); 

// result.ciphertext = 2839aff89d889dd29480b038679fbd6e 
// or result.ciphertext.toString(CryptoJS.enc.Base64) = KDmv+J2IndKUgLA4Z5+9bg== 

C#

byte[] key = Encoding.UTF8.GetBytes("This key is 160 bits"); 
byte[] iv = { 0x10, 0x11, 0x12, 0x13, 
       0x14, 0x15, 0x16, 0x17, 
       0x18, 0x19, 0x1a, 0x1b, 
       0x1c, 0x1d, 0x1e, 0x1f }; 
byte[] encryptMe = Encoding.UTF8.GetBytes("Encrypt Me!"); 

using (RijndaelManaged rm = new RijndaelManaged()) 
{ 
    rm.IV = iv; 
    rm.Key = key; //This is not allowed due to the key size being 160 bits. Exception thrown here. 

    using (ICryptoTransform ict = rm.CreateEncryptor()) 
    { 
     byte[] encrypted = ict.TransformFinalBlock(encryptMe, 0, encryptMe.Length); 
    } 
} 

我的問題是,究竟發生了關鍵的JavaScript代碼,使其能夠用於加密/解密?填充?截斷? CryptoJS中的AES實現是否調整爲使用「奇數」密鑰長度?

我已經嘗試通過截斷或填充(開始和結束)字節數組來調整C#代碼的鍵無濟於事。我對JavaScript語法並不十分熟悉,並且在不瞭解所發生的事情的情況下查看了CryptoJS源代碼。

回答

1

我簡單地看了一下CryptoJS的源代碼,它似乎是在默默地做一些非標準的事情。如果這是真的,那麼使用標準AES無法複製它的功能。

但是,要確保沒有密鑰派生或類似情況,請嘗試執行alert(result.key);並查看它是否與您的輸入相同。

+0

'result.key'返回'54686973206b6579206973203136302062697473'在上面的例子中,它與輸入密鑰完全相同。在將這個答案標記爲正確之前,我會做更多的探索。你必須原諒我,但我想100%肯定這個:) –

+0

雖然這不是一個完全直接的答案,但我確實收到了[Crypto-JS Google Group]的回覆(https:// groups.google.com/forum/#!topic/crypto-js/H8wyNuInn30)。使用當前的CryptoJS 3.1.2,以非文檔指定的方式使用API​​不受支持。 –