«Плохие данные» при расшифровке сообщений с использованием DES3 - PullRequest
0 голосов
/ 01 июня 2009

C # 2008

Я использую следующий код для шифрования и шифрования сообщения. Однако, когда я пытаюсь расшифровать, я получаю ошибку «Bad Data».

Что-то не так с моим кодом ниже?

Большое спасибо,

public string encryptText(string text)
    {
        try
        {
            TripleDESCryptoServiceProvider encrypt = new TripleDESCryptoServiceProvider();

            encrypt.Key = new byte[] { 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 144, 89, 55, 34, 21, 13, 8, 5, 3, 2, 1, 0 };
            encrypt.IV = new byte[] { 1, 2, 3, 5, 8, 13, 21, 34 };
            byte[] byteText = Encoding.Unicode.GetBytes(text);

            ICryptoTransform encryptor = encrypt.CreateEncryptor();

            byte[] encryptedText = encryptor.TransformFinalBlock(byteText, 0, byteText.Length);

            return Encoding.Unicode.GetString(encryptedText);
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);

            return ex.Message;
        }

    }

    /// Decrypt the text
    public string decryptText(string encryptedText)
    {
        try
        {
            byte[] bytesText = Encoding.Unicode.GetBytes(encryptedText);

            TripleDESCryptoServiceProvider decrypt = new TripleDESCryptoServiceProvider();

            decrypt.Key = new byte[] { 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 144, 89, 55, 34, 21, 13, 8, 5, 3, 2, 1, 0 };
            decrypt.IV = new byte[] { 1, 2, 3, 5, 8, 13, 21, 34 };

            ICryptoTransform decryptor = decrypt.CreateDecryptor();

            byte[] originalText = decryptor.TransformFinalBlock(bytesText, 0, encryptedText.Length);

            return Encoding.Unicode.GetString(originalText);
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);

            return ex.Message;
        }
    }

Ответы [ 2 ]

5 голосов
/ 01 июня 2009

Вы берете зашифрованные байты и конвертируете их в строку, используя Encoding.Unicode, но затем вы берете строку и конвертируете ее обратно в байты, используя Encoding.Default. Это в значительной степени гарантировано не работает (если по умолчанию не установлено UTF-16).

Однако вы должны использовать либо из них - преобразование произвольных двоичных данных в текст с использованием кодировки - плохая идея. Вместо этого используйте Convert.ToBase64String (в шифраторе) и Convert.FromBase64String (в расшифровщике).

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

1 голос
/ 01 июня 2009

Да, в коде есть несколько ошибок.

  • encryptedText и bytesText должны быть одним и тем же байтовым массивом. Как предполагает Джон Скит, вы можете использовать кодировку Base64.

  • IV является частью зашифрованного текста. Следовательно, вам не нужно устанавливать IV при расшифровке.

  • Режим шифрования по умолчанию - CBC. Этот режим требует, чтобы IV был случайным (rsp. Непредсказуемым). Следовательно, вы не должны устанавливать фиксированный IV при шифровании. Когда вы создаете CryptoServiceProvider, случайный IV уже установлен. Следовательно, перезапись IV фиксированным значением снижает вашу безопасность.

  • Ввод ключа в код явным образом не является хорошей идеей. Я надеюсь, что вы измените это, как только ваш код покинет экспериментальное состояние.

  • Есть ли причина использовать TripleDes? В противном случае вы можете рассмотреть возможность использования AES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...