2014-11-30 2 views
0

Я делаю проект для школы. У меня есть связь с клиентом сервера с TcpClient и TcpListener. В начале я создаю ключ AES на сервере, а затем отправлю его клиенту с помощью RSA. У меня здесь нет проблем. Однако, когда я пытаюсь зашифровать строку на клиенте, а затем encrpyt на сервере, я получаю исключение.AesCryptoServiceProvider выбрасывает криптографическое исключение

  1. Перетяжка является недействительным и не может быть удален

Серверный код:

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 [], или я удаляю все нулевые значения, я получаю исключение, говорящее, что «входные данные не являются полным блоком».

ответ

0

Я решил эту проблему с помощью:

aes.Padding = PaddingMode.Zeros; 
+1

Я не буду использовать (пока), пожалуйста, прочитайте мой ответ и решите, что вы делаете с этим ответом. –

0

Проблема, скорее всего, Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);. Это означает, что код обрабатывает байты, которые могут иметь любое значение в виде текстовой кодировки. Это означает, что если байты не представляют действительный текст, они либо изменят значение (например, будут заменены вопросительными знаками), либо останутся все вместе.

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


Обратите внимание, что использование PaddingMode.Zeros не решает проблему. При использовании декодирования UTF-8 может быть удалена информация из зашифрованного текста. PaddingMode.Zeros устраняет исключение, оно не решает основной проблемы потери информации.

+0

Хм, это может быть так, но PaddingMode.Zeroes, похоже, работает со мной ... Я больше не получаю никакого исключения. Хотя я получаю слишком много информации, потому что у меня есть байт [1024] массив ... Я решил это, получив int size из потока чтения, а затем скопированный массив в массив фактического размера ... – n32303

+0

Да, это, по крайней мере, * как * важно. Те же самые последствия имеют попытки расшифровать слишком большой зашифрованный текст. У вас теперь есть работа для дополнения PKCS # 7 (по умолчанию)? –

Смежные вопросы