Последовательное шифрование и дешифрование .NET DESCryptoServiceProvider дает неправильные байты после 96-го - PullRequest
0 голосов
/ 02 декабря 2010

В основном, вот код:

        DES des = new DESCryptoServiceProvider();
        PasswordDeriveBytes pdb = new PasswordDeriveBytes(new byte[]{123}, new byte[0]);
        des.IV = new byte[8];
        des.Key = pdb.CryptDeriveKey("DES", "MD5", 0, des.IV);

        byte[] A = Enumerable.Range(1, 100).Select(i => (byte)i).Concat(new byte[4]).ToArray();
        byte[] B = new byte[A.Length];
        byte[] C = new byte[A.Length];

        using (var encryptor = des.CreateEncryptor())
            encryptor.TransformBlock(A, 0, A.Length, B, 0);

        using (var decryptor = des.CreateDecryptor())
            decryptor.TransformBlock(B, 0, B.Length, C, 0);

        for (int i = 0; i < A.Length; i++)
            if (A[i] != C[i])
                Debugger.Break();

Он ломается на i == 96.Почему?

Еще один маленький вопрос: пропуск .Concat(new byte[4]) заставляет первый TransformBlock генерировать ArgumentException.Почему он не может зашифровать массив отсортированных байтов без 4 нулей в конце?

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

DES - это блочный шифр из 64-битных блоков, поэтому кодируемые данные должны быть кратны 64-битным блокам. (см. http://en.wikipedia.org/wiki/Data_Encryption_Standard)

Глядя на 96, я предполагаю, что последний блок отличается на основании того, что вы дополняете 100 (не 64-битный блок) в 104 (64-битный блок), но не устанавливаете значения этих последних 4 байтов равными 0.

Надеюсь, это поможет,

0 голосов
/ 04 декабря 2010

Фактическим решением является использование ITransform.TransformFinalBlock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...