Шифрование ASP.NET DES с длиной зашифрованного текста, равной длине обычного текста

Я хочу зашифровать строку текста с использованием алгоритма DES, но требование состоит в том, чтобы длина зашифрованной строки была такой же, как длина строки обычного текста. Я уже пытался использовать опцию CipherMode.CTS, но получаю CryptoGraphicException «Указанный режим шифрования недействителен для этого алгоритма».

Заранее спасибо.


person abhiroop43    schedule 20.08.2013    source источник
comment
Вы должны показать нам код, который вы пробовали.   -  person ps2goat    schedule 20.08.2013
comment
DES вообще небезопасен, как и режим ECB (и CTS).   -  person ntoskrnl    schedule 20.08.2013


Ответы (1)


Как указано в этой статье CodeProject, опубликованной некоторое время назад.

Режим CTS не поддерживается ни одним из алгоритмов симметричного шифрования, которые в настоящее время поставляются с .NET Framework BCL. Он включен для поддержки новых симметричных алгоритмов, которые впоследствии могут быть производными от класса SymmetricAlgorithm.

Эта статья датирована 2002 годом, но после дальнейшего изучения приведенная выше цитата кажется верной.

К счастью для вас, Bouncy Castle поддерживает CTS.

public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
    BufferedBlockCipher cipher = new CtsBlockCipher(new CbcBlockCipher(new AesEngine()));
    ICipherParameters keyParam = new ParametersWithIV(new KeyParameter(key), iv);
    cipher.Init(true, keyParam);
    return cipher.DoFinal(data, 0, data.Length);
}

public static byte[] Decrypt(byte[] data, byte[] key, byte[] iv)
{
    BufferedBlockCipher cipher = new CtsBlockCipher(new CbcBlockCipher(new AesEngine()));
    ICipherParameters keyParam = new ParametersWithIV(new KeyParameter(key), iv);
    cipher.Init(false, keyParam);
    return cipher.DoFinal(data, 0, data.Length);
}

В этом примере используется CBC, и вам нужно будет использовать фиксированный IV, поскольку вам, вероятно, негде хранить случайный IV для каждого шифрования (что было бы предпочтительнее). Если есть какой-либо способ изменить требование к длине зашифрованных данных, вам, вероятно, следует сделать это и вместо этого использовать AES с CBC и случайным IV. Как минимум используйте AES вместо DES (как в приведенном выше коде). DES небезопасен независимо от того, какой режим блочного шифрования вы используете.

Есть еще две вещи, которые вы должны иметь в виду.

Во-первых, CTS (в реализации Bouncy Castle) требует, чтобы данные, которые вы шифруете, имели длину не менее одного блока. Поэтому, если вы используете AES, ваши данные должны быть не менее 16 байтов, а если вы используете DES, они должны быть не менее 8 байтов.

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

Обновить

Дополнительное примечание о силе/безопасности CTS: Учитывая комментарий ntoskrnl о ECB с CTS (который верен), я подумал, что разумно исследовать, не ослабляет ли CTS каким-либо образом CBC. Но, похоже, это не так.

person Syon    schedule 20.08.2013
comment
Спасибо, Сион за помощь. - person abhiroop43; 02.09.2013