Шифрование / дешифрование Rijndael

#c# #.net

#c# #.net

Вопрос:

У меня есть следующий код для шифрования и дешифрования. Проблема в том, что при дешифровании помимо расшифрованного текста у меня есть какое-то «ааааа» после текста. почему? нужна некоторая помощь. СПАСИБО!

 public static byte[] Encrypt(byte[] PlainTextBytes, string key , string InitialVector)
        {
            try
            {
                System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
               Byte[] KeyBytes = encoding.GetBytes(key);
                byte[] InitialVectorBytes = encoding.GetBytes(InitialVector); 
                RijndaelManaged SymmetricKey = new RijndaelManaged();
                ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes);
                MemoryStream MemStream = new MemoryStream();
                CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write);

                CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);
                CryptoStream.FlushFinalBlock();
                byte[] CipherTextBytes = MemStream.ToArray();

               return CipherTextBytes;
  

//расшифровка

 public static string Decrypt(byte[] PlainTextBytes1, string key, string InitialVector)
    {
        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        Byte[] KeyBytes = encoding.GetBytes(key);
        RijndaelManaged SymmetricKey = new RijndaelManaged();
        byte[] InitialVectorBytes = Encoding.UTF8.GetBytes(InitialVector);

        ICryptoTransform Decryptor = SymmetricKey.CreateDecryptor(KeyBytes, InitialVectorBytes);
        MemoryStream MemStream1 = new MemoryStream(PlainTextBytes1);
        CryptoStream CryptoStream = new CryptoStream(MemStream1, Decryptor, CryptoStreamMode.Read);
        Byte[] pltxt = new byte[PlainTextBytes1.Length];
        CryptoStream.Read(pltxt, 0, pltxt.Length);

         ASCIIEncoding textConverter = new ASCIIEncoding();

         round = textConverter.GetString(pltxt);
          return round;

    }
  

где я не прав?

Комментарии:

1. Являются ли byte[] одинаковыми размерами?

2. нужна помощь .. пожалуйста, дайте решение!

Ответ №1:

В вашей функции дешифрования у вас есть:

 Byte[] pltxt = new byte[PlainTextBytes1.Length];
  

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

  CryptoStream.Read(pltxt, 0, pltxt.Length);
  

Read возвращает, сколько байтов было фактически возвращено. Это не гарантирует, что оно вернет столько байтов, сколько вы запросили.


И затем есть множество других дефектов / плохого стиля:

  1. Параметр, переданный в Decrypt вызывается PlainTextBytes1 , должен называться cyphertext.
  2. Способ создания байтов ключа / инициализации из строки. Кодировка ASCII здесь является плохим выбором. ASCII не может представлять какую-либо байтовую строку. Возможно, вы хотите вместо этого использовать шестнадцатеричное значение en / декодировать строку, вдвое превышающую размер ключа?
  3. ASCII en / декодирование открытого текста будет работать только для символов ASCII и незаметно испортит все остальные символы. Почему бы вам не использовать UTF-8 вместо этого?
  4. соглашения об именовании .net гласят, что вы должны использовать имена в нижнем регистре для параметров

Комментарии:

1. спасибо за ответ! не могли бы вы, пожалуйста, сказать мне, как исправить pltxt, чтобы получить правильный результат? пожалуйста:). спасибо. я знаю, что просить вас переписать код слишком сложно!

2. plus MemoryStream и CryptoStream оба реализуют IDisposable и поэтому должны быть обернуты в using инструкции

3. каково решение проблемы длины заполнения?

4. В документации msdn есть пример: msdn.microsoft.com/en-us/library / … — Это для шифрования / дешифрования файлов, но по тому же принципу