Простое шифрование и дешифрование DES ECB в C#

Я пытаюсь выполнить упражнение, которое включает в себя расшифровку данного зашифрованного ключа сеанса с помощью данного общего ключа. Я расшифровал сеансовый ключ и напечатал массив байтов на экране. (Тот же результат печатается, когда я запускаю программу).

Затем, чтобы проверить свою работу, я пытаюсь снова зашифровать расшифрованный сеансовый ключ (очевидно, с тем же общим ключом), но результат все время разный, когда предполагается вернуть мне исходный зашифрованный сеансовый ключ.

Я не могу понять, это моя ошибка....

Спасибо

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace Crypto
{
    public class Program
    {
        static void Main(string[] args)
        {

        //Shared Master Key
        byte[] mkByteArray = { 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23 };

        //Encrypted Session Key
        byte[] eskByteArray = { 0x4a, 0x4d, 0xe6, 0x87, 0x82, 0x47, 0xd3, 0x7b };

        PrintByteArray(eskByteArray);

        DES des = new DESCryptoServiceProvider();
        des.Mode = CipherMode.ECB;
        des.Padding = PaddingMode.None;
        des.Key = mkByteArray;

        ICryptoTransform ct1 = des.CreateDecryptor();
        byte[] resultArray1 = ct1.TransformFinalBlock(eskByteArray, 0, eskByteArray.Length);
        des.Clear();
        PrintByteArray(resultArray1);

        ICryptoTransform ct2 = des.CreateEncryptor();
        byte[] resultArray2 = ct2.TransformFinalBlock(resultArray1, 0, resultArray1.Length);
        des.Clear();
        PrintByteArray(resultArray2);
        }

        //-----Method to print the byte array on screen-----
        public static void PrintByteArray(byte[] bytes)
        {
            var sb = new StringBuilder("new byte[] { ");
            foreach (var b in bytes)
            {
                sb.Append(b + ", ");
            }
            sb.Append("}");
            Console.WriteLine(sb.ToString());
        }

    }
}

person user2307236    schedule 27.12.2013    source источник


Ответы (2)



Это происходит из-за вектора инициализации. Такое поведение предусмотрено дизайном. Вы же не хотите, чтобы алгоритм шифрования выдавал одинаковые выходные данные для одних и тех же входных данных. Такой алгоритм подвержен атаке с использованием простого текста, когда злоумышленник потенциально может вывести ключ шифрования из входных и выходных данных.

Это происходит в строке

ICryptoTransform ct2 = des.CreateEncryptor();

Согласно msdn

Если текущее свойство IV имеет значение null, вызывается метод GenerateIV для создания нового случайного IV.

Чтобы исправить это, вам нужно установить IV для вашего шифровальщика. Затем вы должны сохранить IV вместе с зашифрованными байтами и использовать его для расшифровки. Простыми словами, IV — это некоторый начальный случайный шум, который позволяет алгоритму шифрования выдавать разные входные данные. Как правило, этот шум должен быть разным для каждого вызова шифрования.

Очевидно, что DES — действительно слабый алгоритм, вы бы хотели использовать хотя бы 3DES. Но даже 3DES используется только для устаревших приложений. Современные приложения используют AES.

person oleksii    schedule 27.12.2013