2012-02-27 5 views
0

현재에서는 System.Security.Cryptography를 사용하여 메신저이는 내 코드입니다 : 소켓을 통해 데이터를 보낼 준비를 할 때, 나는 개인의 키가하는 객체를 생성 내가 이것을 사용이것은 좋은 암호화 방법입니까?

private static SymmetricAlgorithm createCryptoServiceProvider(string key, string IV) 
    { 
     byte[] password; 

     using (MD5 md5 = MD5.Create()) 
      password = md5.ComputeHash(Encoding.UTF8.GetBytes(key)); 
     var crypt = new TripleDESCryptoServiceProvider(); 
     byte[] iv = Encoding.UTF8.GetBytes(IV); 
     crypt.IV = iv; 
     crypt.Key = password; 
     return crypt; 
    } 
    public static byte[] Serialize(object obj, string key, string key2) 
    { 
     var provider = createCryptoServiceProvider(key, key2); 
     using (MemoryStream memory = new MemoryStream()) 
     { 
      using (CryptoStream stream = new CryptoStream(memory, provider.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       BinaryFormatter formatter = new BinaryFormatter(); 
       formatter.Serialize(stream, obj); 
      } 
      return memory.ToArray(); 
     } 

    } 
    public static object Deserialize(byte[] inBytes, string key, string key2) 
    { 
     var provider = createCryptoServiceProvider(key, key2); 

     using(MemoryStream memory = new MemoryStream(inBytes)) 
     { 
      using (CryptoStream stream = new CryptoStream(memory, provider.CreateDecryptor(), CryptoStreamMode.Read)) 
      { 
       BinaryFormatter formatter = new BinaryFormatter(); 
       return formatter.Deserialize(stream); 
      } 
     } 
    } 

필드를 선택하고 키를 유지하여 키를 알고 있으므로 객체가 다른 클라이언트에서 수신되면 해당 개인 문자열 키 key2를 사용하는 전송 된 객체 내부의 함수를 사용합니다. 메시지를 바이트로 암호화하고 키를 ""로 설정 한 다음 바이트를 보유한 객체를 다시 보냅니다. 이제는 원래의 보낸 사람 만 해독 할 수 있습니다. 이렇게하는 것이 좋은 방법입니까 아니면 더 좋은 방법이 있습니까?

답변

4

암호화를 직접 시도하지 마십시오.

http://msdn.microsoft.com/en-us/library/system.net.security.sslstream.aspx

예제 코드는하여 TcpClient를 사용하지만 어떤 스트림 IO와 함께 작동해야하므로 직접 소켓도 잘해야한다.

+0

동의. 암호화가 흥미 롭긴하지만 내 의견으로는 바퀴를 재발 명할 필요가 없습니다. 코드에서 행운을 빈다. – SMT

+0

빠른 답변을 보내 주셔서 감사합니다. 암호화 방법에 대한 많은 질문을 보았지만 어떤 것이 가장 좋았는지 몰랐습니다. – Shredder2500

관련 문제