#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
возвращает, сколько байтов было фактически возвращено. Это не гарантирует, что оно вернет столько байтов, сколько вы запросили.
И затем есть множество других дефектов / плохого стиля:
- Параметр, переданный в
Decrypt
вызываетсяPlainTextBytes1
, должен называться cyphertext. - Способ создания байтов ключа / инициализации из строки. Кодировка ASCII здесь является плохим выбором. ASCII не может представлять какую-либо байтовую строку. Возможно, вы хотите вместо этого использовать шестнадцатеричное значение en / декодировать строку, вдвое превышающую размер ключа?
- ASCII en / декодирование открытого текста будет работать только для символов ASCII и незаметно испортит все остальные символы. Почему бы вам не использовать UTF-8 вместо этого?
- соглашения об именовании .net гласят, что вы должны использовать имена в нижнем регистре для параметров
Комментарии:
1. спасибо за ответ! не могли бы вы, пожалуйста, сказать мне, как исправить pltxt, чтобы получить правильный результат? пожалуйста:). спасибо. я знаю, что просить вас переписать код слишком сложно!
2. plus
MemoryStream
иCryptoStream
оба реализуютIDisposable
и поэтому должны быть обернуты вusing
инструкции3. каково решение проблемы длины заполнения?
4. В документации msdn есть пример: msdn.microsoft.com/en-us/library / … — Это для шифрования / дешифрования файлов, но по тому же принципу