2011-11-07 25 views
1

我在靜態加密類有一個方法,看起來像這樣:AES加密...缺少的重要棋子

public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey) 
    { 
     var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt); 
     using (var provider = new AesCryptoServiceProvider()) 
     { 
      provider.Key = encryptionKey; 
      provider.Mode = CipherMode.ECB; 
      provider.Padding = PaddingMode.ISO10126; 
      using (var encryptor = provider.CreateEncryptor(provider.Key, provider.IV)) 
      { 
       using (var ms = new MemoryStream()) 
       { 
        using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
        { 
         cs.Write(toEncryptBytes, 0, toEncryptBytes.Length); 
         cs.FlushFinalBlock(); 
        } 
        return ms.ToArray(); 
       } 
      } 
     } 
    } 

我有一個單元測試,如下所示:

[TestMethod] 
    public void EncryptStringEncryptsTest() 
    { 
     var toEncrypt = "My text to encrypt"; 
     var encryptionKey = Convert.FromBase64String("93mcgv9UBYpwgoUX0AXEaU1BqTCufPWPkFdOdoILLDA="); 
     var encrypted = Encryption.EncryptString(toEncrypt, encryptionKey); 

     var text = Convert.ToBase64String(encrypted); 
     Assert.IsTrue(false); 
    } 

每次運行這個時,text值都會改變。考慮到相同的投入,我希望它保持不變。期待我錯了,還是我做錯了什麼?

+0

ECB不安全。 – SLaks

+0

請在此定義「不安全」,如果我更改模式,是否需要更改代碼?我幾乎總是使用哈希,所以對稱可逆加密是我必須承認我有一個弱點。 –

+0

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 – SLaks

回答

2

你的假設是不正確的。

ISO10126 padding將追加隨機數據,將您的消息填充到塊大小的倍數。

+0

只是爲了確保一切都被理解,填充的最後一個字節不是隨機的,而是編碼填充字節的數量(在鏈接示例中爲07h)。其餘的字節實際上並未指定,它們*可能*是隨機的,但它們不一定是(因此鏈接的MS文章稍微不正確)。最後,如果填充中的任何位被改變,則密文的完整最後一個塊(DES/3DES的8個字節或AES的16個字節)將改變。 –

+0

哦,如果只有一個填充字節(最小值),那麼即使隨機字節用於較長的填充,結果也將始終相同。 –

1

根據ISO10126,您正在使用隨機填充字節。所以每次結果都不一樣,即使所有的輸入都是一樣的。

+2

有趣的是,它們可能與實現者可以使用PKCS#5填充來實現ISO10126相同。字節不*是隨機的。換句話說,測試可以在創建它的平臺上成功運行,並在另一個平臺上失敗。加密技術不是很有趣嗎? –