2016-01-27 78 views
-1

我在網上找到了this article並實現了它的修改版本。AESManaged爲相同的密鑰/ iv組合返回不同的加密值

public static byte[] Encrypt(byte[] input, byte[] iv) 
    { 
     var aes = new AesManaged(); 

     aes.Key = StringToByteArray("abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"); 
     aes.IV = StringToByteArray("00010001000000000000000000000000"); 
     aes.KeySize = 128; 

     var encryptor = aes.CreateEncryptor(); 

     using (var ms = new MemoryStream()) 
     { 
      using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
      { 
       cs.Write(input, 0, input.Length); 
       cs.Close(); 
      } 

      return ms.ToArray(); 
     } 
    } 

     public static byte[] StringToByteArray(string hex) 
    { 
     var NumberChars = hex.Length; 
     var bytes = new byte[NumberChars/2]; 

     for (var i = 0; i < NumberChars; i += 2) 
      bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 

     return bytes; 
    } 

現在我的問題是,我在這裏提供相同的IV和密鑰(顯然只是用於測試,在生產中我改變了我每次加密IV),但它每次都返回不同的加密字節我加密相同的輸入。

我查找了一些帖子,他們說輸出應該是特定的鍵/ iv組合相同。我在這裏錯過了什麼嗎?


編輯:

[TestMethod] 
    public void Encryption_returns_same_value_for_same_key_and_iv() 
    { 
     const string input = "my input"; 

     var bytes = Encoding.UTF32.GetBytes(input); 

     var result = EncryptionManager.Encrypt(bytes, bytes); 
     var result2 = EncryptionManager.Encrypt(bytes, bytes); 

     Assert.AreEqual(result, result2); 
    } 

這是如何我調用加密方法

+0

你可以在控制檯上打印'aes.Mode'和'aes.Padding'來查看'AesManaged()'類默認使用哪種操作模式?隨機化/填充可能發生。 –

+2

無法複製:http://ideone.com/teoqkr –

+0

@ArtjomB。愛那個無所事事的人。我現在更加困惑 – SZT

回答

1

所以經過一些討論,這個問題實際上是這是不是這裏顯示的代碼的一部分。事實上,上面的原始代碼總是給出相同的結果,並且單元測試應該已經通過(另外在斷言上使用SequenceEqual)。但是,aes.KeySize是在代碼(有些同事)設置鍵後改變了,就像這樣:

aes.Key = StringToByteArray("abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"); 
aes.IV = StringToByteArray("00010001000000000000000000000000"); 

aes.KeySize = 128; 

然而,我們發現通過設置使用

Console.WriteLine("Used Key for Encryption: " + BitConverter.ToString(aes.Key)); 
KeySize財產後輸出使用的關鍵

在修改KeySize之後,密鑰更改爲隨機密鑰。這就是爲什麼我們不斷得到不同的結果。樣本輸出調用函數以相同的輸入向量

用於加密密鑰:C7-35-58-42-3A-2A-79-DE-0D-09-78-20-34 -90-1F-EC
密文:E4-AA-A3-3B-01-CF-F0-C1-07-9A-0B-73-3E-70-C9-8A

用於加密密鑰: 8A-95-E7-26-60-F9-CE-66-BA-A4-DE-D2-FA-70-AC-DE
密文:C5-E7-D3-32-38-21-54-25 -86-61-70-CB-94-46-A6-37

用於加密的密鑰:A4-D7-01-8F-35-2B-7F-2D-E6- 0A-A9-7F-95-42-71-D6
密文:F1-B2-75-64-D1-90-75-32-0D-CB-D9-AE-11-AE-DB-DD

問題通過首先設置KeySize然後設置Key屬性本身來解決。

+0

哈哈剛剛意識到我沒有在原始文章中添加keysize = 256部分。再次感謝您注意它 – SZT