Как использовать дешифрование 3DES в C# в режиме OFB?
Мне нужно расшифровать сообщение, которое было зашифровано с использованием 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 ответа
Сторонний 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 по имени.
Сообщение об ошибке точно сообщает, в чем проблема: "Указанный ключ не является допустимым размером для этого алгоритма".
Вы говорите, что "ключ длиной 24 символа в base64". Base64 кодирует 6 бит на символ, то есть всего 144 бита. Но ключ 3DES должен быть 64-битным (==DES), 128-битным или 196-битным. Вы должны либо использовать ключ соответствующей длины, либо выяснить, что делает библиотека на другом конце, чтобы преобразовать ключ в соответствующую длину.