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源代碼。
'result.key'返回'54686973206b6579206973203136302062697473'在上面的例子中,它與輸入密鑰完全相同。在將這個答案標記爲正確之前,我會做更多的探索。你必須原諒我,但我想100%肯定這個:) –
雖然這不是一個完全直接的答案,但我確實收到了[Crypto-JS Google Group]的回覆(https:// groups.google.com/forum/#!topic/crypto-js/H8wyNuInn30)。使用當前的CryptoJS 3.1.2,以非文檔指定的方式使用API不受支持。 –