AesCryptoServiceProvider генерирует криптографическое исключение
Я делаю какой-то проект для школы. Я имею связь клиента сервера с TcpClient и TcpListener. Вначале я создаю ключ AES на сервере, а затем отправляю его клиенту, используя RSA. У меня нет проблем здесь. Однако, когда я пытаюсь зашифровать строку на клиенте, а затем зашифровать ее на сервере, я получаю исключение.
- Заполнение недействительно и не может быть удалено
Код сервера:
Byte[] bytes = new Byte[1024];
String data = null;
clientStream.Read(bytes, 0, bytes.Length); // preberemo iz streama
//Array.Clear(bytes, 0, bytes.Length);
// string temp = Encoding.UTF8.GetString(bytes11);
//temp = temp.Replace("\0", "");
//yte[] bytes = Encoding.UTF8.GetBytes(temp);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateDecryptor(aes.Key,aes.IV), CryptoStreamMode.Write))
{
//StreamWriter swEncrypt = new StreamWriter(csEncrypt);
csEncrypt.Write(bytes, 0, bytes.Length);
}
byte[] encrypted = msEncrypt.ToArray();
string enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
}
Код клиента:
byte[] messg = Encoding.UTF8.GetBytes(messig);
// dobimo client stream
string enc = null;
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write))
{
csEncrypt.Write(messg,0,messg.Length);
}
byte[] encrypted = msEncrypt.ToArray();
enc = Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
}
byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes(enc);
//CryptoStream CryptStream = new CryptoStream(stream,aes.CreateEncryptor(aes.Key, aes.IV),CryptoStreamMode.Write);
stream.Write(data, 0, data.Length); // pošljem sporočilo
Я получаю исключение на сервере при попытке использовать msEncrypt.ToArray();
Однако, если я динамически выделяю Byte[] или удаляю все нулевые значения, я получаю исключение, говорящее "входные данные не являются полным блоком".
2 ответа
Проблема скорее всего Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);
, Это означает, что код обрабатывает байты, которые могут иметь любое значение, как кодировку текста. Это означает, что если байты не представляют действительный текст, они либо изменят значение (например, будут заменены знаками вопроса), либо пропустят все вместе.
Требуется использовать кодировку base 64 для обработки зашифрованного текста как фактического текста. В наше современное время шифротекст всегда двоичен (обычно сгруппирован в байтах).
Обратите внимание, что с помощью PaddingMode.Zeros
не решает проблему. Может быть удалена информация из зашифрованного текста, если используется декодирование UTF-8. PaddingMode.Zeros
удаляет только исключение, но не решает основную проблему потери информации.