使用RijndaelManaged加密/解密后,某些字节丢失或添加

时间:2014-11-24 19:32:29

标签: .net encryption

这是我的测试代码:

    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)

“Data”是一个512字节的数组,从0到255两次计数。为简单起见,IV和Key是硬编码值。

无论如何,这有两个结果。

首先,DecryptedBuffer开始正常运行0,1,2,3等,但是在239处停止或者总是比应该的少17个字节,无论我为输入指定了多少字节。

其次,fbDecryptedBuffer成功地获得了整个东西,但它在前面填充了16个看似随机的字节。

这是正常的吗?我不明白为什么会发生这种情况,MSDN对此事并没有多大帮助。另外为什么有2种方法可以转换块?他们应该一起使用吗?或者是一个用于处理块而另一个用于处理整个事物?

编辑:哦,实际上似乎2个结果非常相关。通过删除使用TransformBlock方法的代码,TransformFinalBlock代码工作正常。似乎16字节以某种方式卡在解密器中,然后在最终的转换调用中堆积。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是您误导了TrasnformBlock,如果您只使用了一个流,请将TransformBlock视为对Stream.Read(Stream.Write(的调用。 TransformFinalBlock就像调用Stream.Read(Stream.Write(后跟Stream.Close()

一样

这两个功能的原因有时候您希望在收到所有源数据之前开始加密或解密数据。但是,您必须最后拨打TransformFinalBlock,但您可以使用0作为长度来呼叫它。这就是为什么你的例子的第一部分不起作用的原因,你从未调用TransformFinalBlock来写出最后一点数据。

但是,.NET提供了一个包装器,方便您使用。不是使用ICryptoTransform个对象而是使用CryptoStream,而是为您管理层下的复杂。你可以像对待任何其他流一样对待它。有关如何使用它的示例,请参阅the code snippet