/ / Журнал журналу, “Заповнення недійсне і його неможливо видалити” - c #, .net, шифрування, криптографія

Файл журналу "Пошиття недійсне і його неможливо видалити" - c #, .net, шифрування, криптографія

Я знайшов це у файлі журналу помилок, але веб-сайт все ще працює нормально. Мені не вдалося відтворити проблему, я все ще хвилююся з цього приводу, оскільки бачив, що це трапляється досить часто в журналі помилок.

Хтось знав, що спричинило помилку?

public static string Decrypt(string inputText)
{
if (String.IsNullOrEmpty(inputText))
return string.Empty;
RijndaelManaged rijndaelCipher = new RijndaelManaged();
byte[] encryptedData = Convert.FromBase64String(inputText);
PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT);

using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
{
using (MemoryStream memoryStream = new MemoryStream(encryptedData))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
byte[] plainText = new byte[encryptedData.Length];
int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length);
return Encoding.Unicode.GetString(plainText, 0, decryptedCount);
}
}
}
}

Помилка викликає рядок нижче

return Encoding.Unicode.GetString(plainText, 0, decryptedCount);

І це те, що бачили в журналах помилок

System.Security.Cryptography.CryptographicException: Padding is invalid and cannot be removed.
at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at QueryStringModule.Decrypt(String inputText) in line 135
at QueryStringModule.context_BeginRequest(Object sender, EventArgs e) in E:SSv45PagesQueryStringModule.cs:line 46
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Дякую Мін-фей

Відповіді:

2 для відповіді № 1

Так, ви повинні хвилюватися, оскільки з багатьох причин, головна, це те, що ваші дані не розшифровуються, звичайно.

Але розглядаючи код, можна також багато про що турбуватися:

  1. для безпечної URL-адреси веб-сайту слід використовувати базу 64, щоб уникнути випадкових помилок дешифрування;
  2. ключ шифрування та сіль здаються постійними, в такому випадку використовуючи PasswordDeriveBytes не потрібно, а лише забезпечує помилковий захист + небажане уповільнення;
  3. ключ і IV будуть статичними, щоб ви могли розрізнити зашифрований текст;
  4. PasswordDeriveBytes не захищений для даних понад 20 байт і може навіть повторити байти ключа в IV;
  5. в Read метод може повернути не всі байти даних;
  6. він використовує кодування Unicode, що у випадку з Microsoft означає UTF-16LE, в основному вимагаючи в два рази більше байт для звичайного тексту;
  7. відсутність явної обробки помилок або розмежування системних винятків та винятків, пов’язаних із введенням даних.

Ви не повинні використовувати CBC через мережеві з'єднання, де людина посередині можлива через відбиття аракульських атак. Ваші "зашифровані" дані можуть бути не конфіденційними!. Якщо існує багато, багато журналів про це, можливо, хтось насправді розшифровує ваш зашифрований текст, коли ми говоримо.

В основному цей код вдається стрибнути у кожну можливу доступну яму. Проблема, з якою ви стикаєтесь, пов’язана з №1 або №5.

Однак вам слід створити повний редизайн коду, бажано тим, хто знає, що він / вона робить.


1 для відповіді № 2

Ваш код використовує Rijndael, який є блок-шифром, тобто він шифрує дані в 16 символьних блоках (128 бітових блоках).

Якщо останній блок даних, що шифруються, недостатньо довгий (<128 біт), до нього слід додати відступ, щоб забезпечити його шифрування.

Якщо ви явно встановлюєте відступ під часшифрування, вам потрібно переконатися, що ви чітко встановили його також під час дешифрування. Якщо ви не встановлюєте його явно під час шифрування, вам не потрібно явно встановлювати його під час розшифрування - просто переконайтеся, що обидва методи збігаються.

Ви також можете отримати цю помилку, якщо ключ, який використовується при шифруванні, не той, що використовується для розшифрування.