2011-08-11 35 views
0

클라이언트/서버 응용 프로그램이 있습니다. 서버 및 클라이언트 통신은 암호화됩니다. 서버는 암호화 된 메시지를 클라이언트와 클라이언트에게 보내고 메시지를 해독합니다. 클라이언트 메시지와 동일합니다. 큰 데이터를 클라이언트에 보내거나 클라이언트가 서버로 큰 데이터를 보내는 경우 "해독 할 데이터의 길이가 잘못되었습니다."라는 오류가 발생합니다. 데이터 전송이 작은 경우 문제가 없습니다. 데이터 길이를 암호화하거나 해독하는 데 제한이 있습니까? 여기 "해독 할 데이터의 길이가 유효하지 않습니다"오류

내 코드입니다 :

static byte[] Encrypt(byte[] plaintext, byte[] key, byte[] IV) 
    { 
     RijndaelManaged myRijndael = new RijndaelManaged(); 
     myRijndael.Padding = PaddingMode.PKCS7; 
     ICryptoTransform encryptor = myRijndael.CreateEncryptor(key, IV); 
     MemoryStream msEncrypt = new MemoryStream(); 
     CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); 
     csEncrypt.Write(plaintext, 0, plaintext.Length); 
     csEncrypt.FlushFinalBlock(); 

     return msEncrypt.ToArray(); 

    } 


    public static string Encrypt(string plainText, string password) 
    { 

     byte[] byteDizi = Encoding.Unicode.GetBytes(plaintext); 


     PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, 
                  new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 
                     0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 


     byte[] sifreliV = Encrypt(byteDizi, 
      pdb.GetBytes(32), pdb.GetBytes(16)); 
     return Convert.ToBase64String(sifreliV); 

    } 


    // Dekriptolama bir parola ve IV kullanarak 

    static byte[] Decrypt(byte[] encryptedData, 
          byte[] Key, byte[] IV) 
    { 
     RijndaelManaged myRijndael = new RijndaelManaged(); 
     myRijndael.Padding = PaddingMode.PKCS7; 
     ICryptoTransform decryptor = myRijndael.CreateDecryptor(Key, IV); 
     MemoryStream msDecrypt = new MemoryStream(encryptedData); 
     CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); 
     byte[] fromEncrypt = new byte[encryptedData.Length]; 
     csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length); 

     return fromEncrypt; 

    } 


    public static string Decrypt(string encryptedData, string password) 
    { 

     byte[] encryptedByte = Convert.FromBase64String(encryptedData); 

     PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, 
                  new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 
                     0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); 

     byte[] DecryptedData = Decrypt(encryptedByte, 
      pdb.GetBytes(32), pdb.GetBytes(16)); 

     return Encoding.Unicode.GetString(DecryptedData); 
    } 
} 
+1

암호화 방법의 내부에서 'byte []'배열과 Base64'String' 배열의 길이를 기록하십시오. 복호화 방법의 내부에서 들어오는 Base64'String'과 그에 따른'byte []'배열의 길이에 대한 유사한 레코드를 만듭니다. 일치합니까? 특히 대용량 파일의 경우 문제가 발생한다고 말합니다. – rossum

답변

0

기타 내가 도움이 될 것입니다 생각 제안을 언급 한; 내가 게시 한 코드에 대해 사용자가 설명하는 동작을 유발할 수있는 문제가 즉시 표시되지 않습니다.

  1. 암호 소금 암호에 특정되지 않습니다 : 내가 언급하고 싶어 무엇

    이 구현 몇 가지 심각한 보안 문제가 있다는 것입니다. 암호를 사용하여 데이터베이스에 소금을 저장하는 것이 가장 좋습니다. 각 암호에는 고유 한 임의의 염이 있어야합니다. 이렇게하면 누군가 한 암호 해시에 대한 암호를 발견하면 다른 사용자 계정에 동일한 암호가 있는지 알 수 없습니다.

  2. 초기화 벡터 ("IV")는 키와 마찬가지로 암호에서 나옵니다. 이는 동일한 암호를 사용하는 사용자가 수행 한 모든 암호화가 동일한 IV를 가짐을 의미합니다. IV는 이 아니며을 다시 사용해야합니다. http://en.wikipedia.org/wiki/Initialization_vector#Properties은 IV가 고유해야하며 예측할 수 없다고 명시합니다. RNGCryptoServiceProvider를 사용하여 임의의 IV를 생성합니다.

    일반적으로 저는 암호화 기능에 임의의 IV를 생성하고 싶습니다. 그런 다음 IV를 암호화 된 메시지 앞에 추가합니다. decrypt 함수는 암호화 된 메시지의 시작 부분에서 IV를 제거하여 암호 해독 클래스를 초기화 한 다음 나머지 바이트를 암호 해독합니다.

    이 이유는 동일한 일반 텍스트 (예 : 공통 헤더 구조)로 시작하고 동일한 키로 암호화 된 두 개의 메시지가 처음에는 동일한 암호문을 갖게되기 때문입니다. 공격자가이를 사용하여 키를 발견 할 수 있습니다.

현대의 암호화는 모든 세부 사항이 완벽하게 수행되는 경우에만 올바르게 작동합니다. 그렇지 않으면 작은 구현 문제로 인해 심각한 보안 문제로 인해 신속하게 분열 될 수 있습니다. 당신이 일한 것을 얻은 다음, 이러한 변화를 구현하십시오.

관련 문제