2014-11-30 3 views
0

학교용 프로젝트를 진행하고 있습니다. TcpClient 및 TcpListener와 서버 클라이언트 통신을하고 있습니다. 처음에는 서버에서 AES 키를 만든 다음 RSA를 사용하여 클라이언트에 보냅니다. 나는 여기에 아무런 문제가 없다. 그러나 클라이언트에서 문자열을 암호화 한 다음 서버에서 encrpyt하려고하면 예외가 발생합니다.AesCryptoServiceProvider가 암호화 예외를 throw합니다.

  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();

그러나 내가 dinamically Byte []를 할당하거나 모든 null 값을 제거하면 "입력 데이터가 완전한 블록이 아닙니다"라는 예외가 발생합니다.

답변

0

은 내가 사용하여이 해결 한 :

aes.Padding = PaddingMode.Zeros; 
+1

나는 downvote하지 않을 것이다 (아직), 나의 대답을 읽고 당신이이 대답으로 무엇을 결정하십시오. –

0

문제는 가능성이 Encoding.UTF8.GetString(encrypted, 0, encrypted.Length);입니다. 즉, 코드는 텍스트 인코딩으로 모든 값을 가질 수있는 바이트를 처리합니다. 즉, 바이트가 유효 텍스트를 나타내지 않으면 값을 변경 (예 : 물음표로 대체)하거나 모두 함께 버려집니다.

암호문을 실제 텍스트로 처리하려면 기본 64 인코딩을 사용해야합니다. 이 현대 시대에서 암호문은 항상 이진 파일 (보통 바이트 단위로 그룹화 됨)입니다.


PaddingMode.Zeros을 사용하면 문제가 해결되지 않습니다. UTF-8 디코딩이 사용되면 암호문에서 정보가 제거 될 수 있습니다. PaddingMode.Zeros만이 예외를 제거하고 정보 손실의 근본적인 문제를 해결하지 못합니다.

+0

흠, 그럴 수도 있겠지만 PaddingMode.Zeroes는 나와 함께 작동하는 것 같습니다. 더 이상 예외가 없습니다. 바이트 [1024] 배열을 가지고 있기 때문에 너무 많은 정보를 얻었지만 ... int 크기를 읽은 스트림에서 복사 한 다음 배열을 실제 크기의 배열에 복사합니다 ... – n32303

+0

어, 그래, 적어도 중요합니다. 너무 큰 암호문을 해독하려고하면 동일한 결과가 발생합니다. PKCS # 7 (기본) 패딩을 위해 지금 작업하고 있습니까? –

관련 문제