2014-11-24 36 views
1

丟失或加密後添加一些字節/解密這是我的測試代碼:與RijndaelManaged的

Dim bah As New System.Security.Cryptography.RijndaelManaged 
    bah.Mode = Security.Cryptography.CipherMode.CBC 
    bah.Padding = Security.Cryptography.PaddingMode.ISO10126 
    bah.KeySize = 128 
    bah.BlockSize = 128 
    bah.FeedbackSize = 128 
    bah.Key = Key 
    bah.IV = {1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8} 

    Dim Encryptor = bah.CreateEncryptor() 
    Dim Decryptor = bah.CreateDecryptor() 


    Dim EncryptedBuffer(1023) As Byte 
    Dim encLen As Integer = Encryptor.TransformBlock(Data, 0, 256, EncryptedBuffer, 0) 
    Dim DecryptedBuffer(1023) As Byte 
    Dim decLen As Integer = Decryptor.TransformBlock(EncryptedBuffer, 0, encLen, DecryptedBuffer, 0) 

    Dim fbEncryptedBuffer() As Byte = Encryptor.TransformFinalBlock(Data, 0, Data.Count) 
    Dim fbDecryptedBuffer() As Byte = Decryptor.TransformFinalBlock(fbEncryptedBuffer, 0, fbEncryptedBuffer.Count) 

「數據」是一個512字節數組,計數從0到255的兩倍。爲簡單起見,IV和Key是硬編碼值。

總之,有2個結果與此產生。

首先,DecryptedBuffer從0,1,2,3等開始都是正確的,但是在239處停止短路,或者總是比我應該指定的多少字節小17個字節。

其次,fbDecryptedBuffer成功獲取整個事物,但它的前面填充了16個看似隨機的字節。

這是正常的嗎?我不明白爲什麼要發生這種情況,而MSDN在這件事上並沒有什麼幫助。另外爲什麼有2種方法來轉換塊?他們是否應該結合使用?或者一個用於處理大塊而另一個用於處理整個事物?

編輯:哦,它實際上似乎2結果非常連接。通過刪除使用TransformBlock方法的代碼,TransformFinalBlock代碼可以正常工作。似乎有16個字節以某種方式卡在解密器中,然後在最終的轉換調用中堆積起來。

回答

1

您遇到的問題是,你在不當TrasnformBlock,如果你只是一個流想起TransformBlockStream.Read(Stream.Write(呼叫工作在哪裏。其中TransformFinalBlock就像調用Stream.Read(Stream.Write(後跟一個Stream.Close()

的原因兩種功能有時是要啓動加密或是否已收到所有源數據之前解密數據。不過,您必須始終致電TransformFinalBlock,但您可以使用0作爲長度。這就是爲什麼你的例子的第一部分不起作用,你永遠不會叫TransformFinalBlock寫出最後一個數據位。

但是,.NET提供了一個包裝器,可以讓您輕鬆實現。而不是使用ICryptoTransform對象,而是使用CryptoStream來替代,它可以爲您管理複雜的圖層。你只需要像對待任何其他流一樣對待它。有關如何使用它的示例,請參見the code snippet

相關問題