Проблема с обновлением до .Net 6 — шифрование строкиC#

Место общения программистов C#
Ответить
Anonymous
 Проблема с обновлением до .Net 6 — шифрование строки

Сообщение Anonymous »


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

Это хорошо сработало в .Net 5.
Теперь я хотел обновить свой проект до .Net 6.

При использовании .Net 6 расшифрованная строка обрезается в определенной точке в зависимости от длины входной строки.

▶️ Чтобы облегчить отладку/воспроизведение моей проблемы, я создал здесь общедоступный репозиторий репродукций.
[*]Код шифрования специально используется в проекте Standard 2.0. [*]На этот проект ссылаются как консольные проекты .Net 6, так и .Net 5.
Оба метода шифрования вызываются с одним и тем же вводом "12345678901234567890" с путевой фразой "nzv86ri4H2qYHqc&m6rL".

Вывод .Net 5: "12345678901234567890"
Вывод .Net 6: "1234567890123456"

Разница в длине составляет 4.

Я также просмотрел критические изменения для .Net 6, но не смог найти что-то, что помогло бы мне найти решение.

Я рад любым предложениям по моей проблеме, спасибо!

Класс шифрования

публичный статический класс StringCipher { // Эта константа используется для определения размера ключа алгоритма шифрования в битах. // Мы делим это на 8 в приведенном ниже коде, чтобы получить эквивалентное количество байтов. частная константа int Keysize = 128; // Эта константа определяет количество итераций функции генерации байтов пароля. частная константа int DerivationIterations = 1000; публичная статическая строка Encrypt (строка PlainText, строка passPhrase) { // Salt и IV генерируются каждый раз случайным образом, но добавляются к зашифрованному тексту // чтобы при расшифровке можно было использовать одни и те же значения Salt и IV. вар saltStringBytes = Generate128BitsOfRandomEntropy(); вар ivStringBytes = Generate128BitsOfRandomEntropy(); вар PlainTextBytes = Encoding.UTF8.GetBytes(plainText); используя (пароль var = новый Rfc2898DeriveBytes (passPhrase, saltStringBytes, DerivationIterations)) { вар keyBytes = пароль.GetBytes(Keysize / 8); используя (var symmetricKey = Aes.Create()) { symmetricKey.BlockSize = 128; symmetricKey.Mode = CipherMode.CBC; symmetricKey.Padding = PaddingMode.PKCS7; используя (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes)) { используя (var MemoryStream = новый MemoryStream()) { используя (var cryptoStream = новый CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { cryptoStream.Write(plainTextBytes, 0, PlainTextBytes.Length); cryptoStream.FlushFinalBlock(); // Создаем последние байты как конкатенацию случайных байтов соли, случайных байтов iv и байтов шифрования. вар cipherTextBytes = saltStringBytes; cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray(); cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray(); MemoryStream.Close(); криптопоток.Закрыть(); return Convert.ToBase64String(cipherTextBytes); } } } } } } общедоступная статическая строка Decrypt (строка cipherText, строка passPhrase) { // Получаем полный поток байтов, который представляет: // [32 байта Salt] + [16 байтов IV] + [n байтов CipherText] вар cipherTextBytesWithSaltAndIv = Convert.FromBase64String(cipherText); // Получаем сольбайты, извлекая первые 16 байтов из предоставленных байтов cipherText. вар saltStringBytes = cipherTextBytesWithSaltAndIv.Take(Keysize / 8).ToArray(); // Получаем IV байты, извлекая следующие 16 байтов из предоставленных байтов cipherText. var ivStringBytes = cipherTextBytesWithSaltAndIv.Skip(Keysize/8).Take(Keysize/8).ToArray(); // Получите фактические байты зашифрованного текста, удалив первые 64 байта из строки cipherText. var cipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((Keysize / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((Keysize / 8) * 2)).ToArray(); используя (пароль var = новый Rfc2898DeriveBytes (passPhrase, saltStringBytes, DerivationIterations)) { вар keyBytes = пароль.GetBytes(Keysize / 8); используя (var symmetricKey = Aes.Create()) { symmetricKey.BlockSize = 128; symmetricKey.Mode = CipherMode.CBC; symmetricKey.Padding = PaddingMode.PKCS7; используя (var decryptor = symmetricKey.CreateDecryptor(keyBytes, ivStringBytes)) { используя (var MemoryStream = новый MemoryStream (cipherTextBytes)) { используя (var cryptoStream = новый CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) { вар PlainTextBytes = новый байт [cipherTextBytes.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, PlainTextBytes.Length); MemoryStream.Close(); криптопоток.Закрыть(); return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); } } } } } } частный статический байт [] Generate128BitsOfRandomEntropy() { вар randomBytes = новый байт [16]; // 16 байт дадут нам 128 бит. используя (var rngCsp = RandomNumberGenerator.Create()) { // Заполняем массив криптографически безопасными случайными байтами. rngCsp.GetBytes(randomBytes); } вернуть случайные байты; } } Код вызова
var input = "12345678901234567890"; вар inputLength = input.Length; вар inputBytes = Encoding.UTF8.GetBytes(вход); var зашифрован = StringCipher.Encrypt(input, "nzv86ri4H2qYHqc&m6rL"); вывод var = StringCipher.Decrypt(зашифровано, "nzv86ri4H2qYHqc&m6rL"); вар выходная длина = выход.Длина; вар outputBytes = Encoding.UTF8.GetBytes(выход); вар lengthDiff = inputLength - outputLength;
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»