DES возвращает 128 битов вместо 64

341
05 ноября 2017, 15:39

Взял код для работы с DES с сайта MSDN:

private byte[] encryptDES(byte[] Data, byte[] Key, byte[] IV)
    {
        try
        {
            // Create a MemoryStream.
            MemoryStream mStream = new MemoryStream();
            // Create a new DES object.
            DES DESalg = DES.Create();
            // Create a CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cStream = new CryptoStream(mStream,
                DESalg.CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);
            // Write the byte array to the crypto stream and flush it.
            cStream.Write(Data, 0, Data.Length);
            cStream.FlushFinalBlock();
            // Get an array of bytes from the 
            // MemoryStream that holds the 
            // encrypted data.
            byte[] ret = mStream.ToArray();
            // Close the streams.
            cStream.Close();
            mStream.Close();
            // Return the encrypted buffer.
            return ret;
        }
        catch (CryptographicException ex)
        {
            return null;
        }
    }
    private byte[] decriptDES(byte[] Data, byte[] Key, byte[] IV)
    {
        try
        {
            // Create a new MemoryStream using the passed 
            // array of encrypted data.
            MemoryStream msDecrypt = new MemoryStream(Data);
            // Create a new DES object.
            DES DESalg = DES.Create();
            // Create a CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                DESalg.CreateDecryptor(Key, IV),
                CryptoStreamMode.Read);
            // Create buffer to hold the decrypted data.
            byte[] fromEncrypt = new byte[Data.Length];
            // Read the decrypted data out of the crypto stream
            // and place it into the temporary buffer.
            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
            //Convert the buffer into a string and return it.
            return fromEncrypt;
        }
        catch (CryptographicException ex)
        {
            return null;
        }
    }

В метод шифрования передаю 64-битовые сообщение и ключ. На выходе я получаю 128 битов. Дешифровав их, я получаю своё 64-разрядное сообщение и 64 нуля. Буду признателен, если подскажите, как убрать лишние разряды.

Answer 1

DES - блочный алгоритм, и размер массива зашифрованных данных в нем кратен размеру блока.

Проблема в коде дешифоровки в том, что он возвращает результат в массиве, по размеру равному массиву зашифрованных данных:

byte[] fromEncrypt = new byte[Data.Length];

Хотя точное количество дешифрованных байт возвращается методом Read. Достаточно просто выделить буфер нужного размера и скопировать в него результат:

var total = csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
byte[] result = new byte[total];
Array.Copy(fromEncrypt, result, total);
return result;
READ ALSO
Entity Framework. System.Data.Entity.Infrastructure.DbUpdateException [требует правки]

Entity Framework. System.Data.Entity.Infrastructure.DbUpdateException [требует правки]

Сижу делаю приложуньку, которая работает с базой данныхИ случайно удалил модель ADO

268
Как сделать скриншот окна?

Как сделать скриншот окна?

Надо сделать скриншот отдельного окна на экранеДопустим калькулятора

389
WinForms | Проблемы с элементом FlowLayoutPanel

WinForms | Проблемы с элементом FlowLayoutPanel

Имеются проблемы с элементом FlowLayoutPanel в программеУ меня существует UserControlPanel - так вот этот элемент я в отдельном потоке бесконечно, добавляю...

311
Натяжение в 2d играх

Натяжение в 2d играх

Здравствуйтеинтересует вопрос, как сделать перемещение 2d объектов с помощью перемещения пальца по экрану

182