Как использовать дешифрование 3DES в C # в режиме OFB? - PullRequest
3 голосов
/ 03 февраля 2011

Мне нужно расшифровать сообщение, которое было зашифровано с использованием 3DES в режиме OFB.

У меня есть зашифрованное сообщение. У меня есть ключ. У меня есть IV.

Я на платформе .Net

Зашифрованное сообщение имеет длину 24 символа в base64. Ключ длиной 24 символа в base64. а IV - это 64-битное двоичное число.

Из-за отсутствия примеров я попытался использовать пример режима ECB, как показано ниже:

   public static string DecryptTextFromMemory(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 CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            CryptoStream csDecrypt = new CryptoStream(msDecrypt,
                new TripleDESCryptoServiceProvider().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 new ASCIIEncoding().GetString(fromEncrypt);
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
            return null;
        }
    }

Это ошибка, которую я получаю:

Произошла криптографическая ошибка: указанный ключ недопустим для этого алгоритма.

Я пробовал другие примеры кода, где я изменил алгоритм на OFB и он говорит, что он не поддерживается.

Может кто-нибудь помочь мне? Я явно не в курсе этих вещей, поэтому, пожалуйста, наберитесь терпения, если я что-то напутал.

Существует множество примеров дешифрования 3DES в режиме ECB, но мало или ничего я не могу найти в режиме OFB.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Сторонний API CryptoSys говорит, что он специально поддерживает Triple-DES в режиме OFB. Не знаю, почему реализация .NET не будет, хотя веской причиной может быть препятствовать ее использованию в новых разработках в пользу гораздо более быстрых шифров Rijndael и AES.

РЕДАКТИРОВАТЬ: просто чтобы объяснить, "режим" алгоритма является определенным способом, которым базовый алгоритм шифрования Triple-DES используется для получения зашифрованного текста. Они стали стандартизированы по большинству алгоритмов с симметричным ключом. Режим OFB является одним из двух стандартных режимов «потокового шифра», которые используют базовый алгоритм для создания «регистра сдвига» на основе уже зашифрованного текста, позволяя вместо этого шифровать текст после первого «блока» по одному байту за раз. из более крупных "блоков".

В любом случае, ошибка «размера ключа» указывает на конкретный тип проблемы. Алгоритмы Triple-DES (ВСЕ из них; это не зависит от реализации) требуют ключа длиной 128 или 192 бита. Вы получаете ключ в виде байтового массива, поэтому вам нужен массив длиной ровно 16 или 24 элемента. Это должно быть одним из ваших первых проверок; выдает ArgumentException, если ключ имеет неправильный размер. Отслеживайте проблему в стеке вызовов до тех пор, пока не найдете, где сгенерирован ключ, и устраните проблему в ее источнике.

Далее, если вы установите для свойства Mode TripleDesCryptoServiceProvider значение OFB, и оно даст вам CryptoException либо сразу, либо когда вы начнете дешифровать, что режим не поддерживается, тогда это ограничение .NET; Команда разработчиков .NET не удосужилась внедрить этот режим этого алгоритма в провайдере. Это будет больше проблем, чем стоит попытаться свернуть свое собственное; вам придется искать стороннюю реализацию, которая может быть использована кодом .NET. Практически любая библиотека, зарегистрированная для COM-взаимодействия, справится с задачей, не обязательно писать на языке .NET. Есть десятки; Я бы выполнил поиск CryptoSys, поскольку, как я уже сказал, в документации говорится, что он поддерживает TripleDES OFB по имени.

1 голос
/ 03 февраля 2011

Сообщение об ошибке точно сообщает, в чем проблема: «Указанный ключ не является допустимым размером для этого алгоритма.»

Вы говорите, что «ключ длиной 24 символа в base64». Base64 кодирует 6 бит на символ, то есть всего 144 бита. Но ключ 3DES должен быть 64-битным (== DES), 128-битным или 196-битным. Вы должны либо использовать ключ соответствующей длины, либо выяснить, что делает библиотека на другом конце, чтобы преобразовать ключ в соответствующую длину.

...