Как исправить функцию шифрования AES, добавив \ 0 \ 0 \ 0 в конец зашифрованного текста? - PullRequest
0 голосов
/ 27 мая 2019

Когда я расшифровываю зашифрованное имя пользователя с использованием шифрования AES, в конце расшифрованного имени пользователя отображается группа «\ 0 \ 0 \ 0». Есть ли способ не добавлять их при шифровании?

Пример кода шифрования и дешифрования:

  string ky = xx_Convert.Base64ToString("RllhSzNjM09PZFAwT2RYMkdxOFI2cG9HYjVmWVIybnQ=");
  string iv = xx_Convert.Base64ToString("Y2pZQmJsdVlqdlBYM0RtcXVleDJkNGNTa0FIYjhYQ2Y=");

  string username = "test@mail.com";

  string encriptedUsername = xx_Crypto.EncryptAES(ky, iv, username);
  string encriptedPassword = xx_Crypto.EncryptAES(ky, iv, "password");

  string decryptedUsername = xx_Crypto.DecryptAES(ky, iv, encriptedUsername);
  string decryptedPassword = xx_Crypto.DecryptAES(ky, iv, encriptedPassword);

Это дает следующий результат для decryptedUsername при проверке переменной: "test@mail.com \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0"

Это, вероятно, результат свойства Padding функции шифрования. В функции Encryption Padding установлен на Padding = PaddingMode.Zeros, но когда я удаляю эту строку, он все еще дополняет результат, но с другими невидимыми символами.

Функция шифрования:

public static string EncryptAES(string keyString, string ivString, string 
text)
{
  RijndaelManaged myRijndael = new RijndaelManaged()
  {
    Padding = PaddingMode.Zeros,
    Mode = CipherMode.CBC,
    KeySize = 256,
    BlockSize = 256
  };

  byte[] key = Encoding.UTF8.GetBytes(keyString);
  byte[] IV = Encoding.UTF8.GetBytes(ivString);

  ICryptoTransform encryptor = myRijndael.CreateEncryptor(key, IV);

  byte[] encrypted = null;
  using (MemoryStream msEncrypt = new MemoryStream())
  {
    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, 
          CryptoStreamMode.Write))
    {
      using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
      {
        //Write all data to the stream.
        swEncrypt.Write(text);
      }
      encrypted = msEncrypt.ToArray();
    }
  }

  return (Convert.ToBase64String(encrypted));
}

Редактировать : В соответствии с запросом здесь используется функция расшифровки:

public static string DecryptAES(string keyString, string ivString, string text)
{
  var myRijndael = new RijndaelManaged()
  {
    Padding = PaddingMode.Zeros,
    Mode = CipherMode.CBC,
    KeySize = 256,
    BlockSize = 256
  };

  byte[] key = Encoding.UTF8.GetBytes(keyString);
  byte[] IV = Encoding.UTF8.GetBytes(ivString);

  ICryptoTransform decryptor = myRijndael.CreateDecryptor(key, IV);

  byte[] sEncrypted = Convert.FromBase64String(text);

  byte[] fromEncrypt = new byte[sEncrypted.Length];

  MemoryStream msDecrypt = new MemoryStream(sEncrypted);
  CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

  csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);

  return (Encoding.UTF8.GetString(fromEncrypt));
}

Так можно ли это предотвратить в функции шифрования?

P.S .: Я не использовал те же клавиши, что и в исходном коде

1 Ответ

0 голосов
/ 28 мая 2019

Так можно ли это предотвратить в функции шифрования?

Да, просто используйте:

read = csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
return (Encoding.UTF8.GetString(fromEncrypt, 0, read));

В данный момент вы кодируете весь буфер.Байты заполнения удаляются, но байты в буфере устанавливаются в ноль во время инициализации при создании буфера.

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

...