Криптография C # .NET не расшифровывается должным образом

1

Я пытаюсь зашифровать и расшифровать текст в С# (.NET 3.5), выяснив, что этот простой код не работает:

    private const string KEY = "Chiave";

    static void Main(string[] args)
    {

        string plainText = "Data to be encrypted";

        byte[] keyArray;
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(KEY));

        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(plainText);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] encArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.PKCS7;

        cTransform = tdes.CreateDecryptor();
        byte[] decArray = cTransform.TransformFinalBlock(encArray, 0, encArray.Length);

        if (encArray.Length == decArray.Length)
        {
            for (int i = 0; i < encArray.Length; ++i)
                Console.Out.Write("{0,3}|{1,3}", encArray[i], decArray[i]);
        } else
            Console.Out.Write("Length error!");

        Console.In.Read();
    }

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

От https://msdn.microsoft.com/it-it/library/system.security.cryptography.ciphermode(v=vs.110).aspx о ECB:

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

Это некоторые результаты после enc. и дек.

��u��T�be encrypted
U����ŋbe encrypted
5�AL\"0be encrypted

И так далее, спасибо в совет.

  • 1
    Это из-за IV. Извините, надо спать, вы найдете примеры, теперь вы знаете, что искать.
Теги:
encryption
cryptography
tripledes

1 ответ

1
Лучший ответ

Вы создали новый экземпляр TripleDESCryptoServiceProvider но этот новый экземпляр не имеет того же значения IV первого

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

private const string KEY = "Chiave";
static void Main(string[] args)
{
    string plainText = "Data to be encrypted";

    byte[] keyArray;
    MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
    keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(KEY));

    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(plainText);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.CBC;
    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] encArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    // REMOVE THESE LINES 
    // tdes = new TripleDESCryptoServiceProvider();
    // tdes.Key = keyArray;
    // tdes.Mode = CipherMode.CBC;
    // tdes.Padding = PaddingMode.PKCS7;

    cTransform = tdes.CreateDecryptor();
    byte[] decArray = cTransform.TransformFinalBlock(encArray, 0, encArray.Length);

    // if (encArray.Length == decArray.Length)
    // {
    //    for (int i = 0; i < encArray.Length; ++i)
    //        Console.Out.Write("{0,3}|{1,3}", encArray[i], decArray[i]);
    //} else
    //    Console.Out.Write("Length error!");

    string result = UTF8Encoding.UTF8.GetString(decArray);
    Console.WriteLine(result);

    Console.In.Read();
}
  • 0
    Спасибо, что это было IV (я пропустил вычисление результирующей строки как кодирование base64 зашифрованного текста, чтобы убедиться, что это не проблема кодирования)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню