2012-07-10 8 views
1

web.config의 정보와 같은 중요한 정보를 보호하기 위해 .Net을 통해 mvc 응용 프로그램에서 작업하고 있습니다. 암호화하는 두 가지 기능이 있습니다. Triple DES를 사용하여 정보를 암호 해독합니다. 그러나 저는 이것에 익숙하지 않고 친구의 도움을 받아 여기서 여기 몇 가지 질문을하는 데 성공했습니다.암호화 된 문자열에 TDES IV (초기화 벡터)를 추가하고 검색하는 방법

현재 내가 갇혀있는 지점은 어떻게 암호화 된 문자열의 끝에 TDES IV (Initialization Vector)을 추가 할 수 있으며 해독 중에 다시 검색하는 방법은 무엇입니까? 내 말은 암호화 된 정보에서 여기에서 IV (Initialization Vector) 개의 별을 어떻게 식별하겠습니까?

친절히 도움.

public static string Encrypt(string Message) 
    { 
     byte[] iv; 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(GetSHA256String())); 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
     TDESAlgorithm.Key = TDESKey; 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 
     // Capture the randomly generated IV 
     iv = TDESAlgorithm.IV; 
     byte[] DataToEncrypt = UTF8.GetBytes(Message); 
     try 
     { 
      ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor(); 
      Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length); 
      //var lnght=Results.GetLength(0); 
      //System.Buffer.BlockCopy(iv, 0, Results, lnght + 1, iv.Length()); //HOW? 
     } 
     finally 
     { 
      TDESAlgorithm.Clear(); 
      HashProvider.Clear(); 
     } 
     return Convert.ToBase64String(Results); 
     //return Encoding.UTF8.GetString(Results); 
    } 

    public static string Decrypt(string Message) 
    { 
     byte[] Results; 
     System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
     MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider(); 
     byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(GetSHA256String())); 
     TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider(); 
     TDESAlgorithm.Key = TDESKey; 
     // Apply the same IV used during encryption 
     //TDESAlgorithm.IV = iv; // HOW? 
     TDESAlgorithm.Mode = CipherMode.ECB; 
     TDESAlgorithm.Padding = PaddingMode.PKCS7; 
     try 
     { 
      byte[] DataToDecrypt = Convert.FromBase64String(Message); 
      //byte[] DataToDecrypt = UTF8.GetBytes(Message); 
      //byte[] DataToDecrypt = Encoding.UTF8.GetBytes(Message); 
      ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor(); 
      Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length); // << ERROR is here. 
     } 
     finally 
     { 
      TDESAlgorithm.Clear(); 
      HashProvider.Clear(); 
     } 
     return UTF8.GetString(Results); 
    } 

… 
… 
… 
+0

우선 메시징은 오라클 패딩에 취약하기 때문에 무결성 검사가 필요합니다. 둘째, 적어도 CBC를 사용해야하거나 암호문 내에서 일반 텍스트를 구별 할 수 있습니다. 그런 다음 IV를 * ciphertext * 앞에 평평하게 놓아야합니다. PKCS # 7을 유지하면 적어도 문자 (문자) 인코딩/디코딩을 수행 할 수있는 충분한 포인트를 얻을 수 있습니다. 3DES 대신 AES를 사용하는 것도 아주 좋은 생각입니다. 모드 등을 올바르게 설정하는 것이 훨씬 더 중요합니다. –

답변

2

문제는 ECB 모드를 사용하고 있다는 것입니다. ECB는 IV를 지원하지 않으며 여러 가지 바람직하지 않은 속성을 가지고 있습니다. 대신 CBC로 전환 할 수 있습니다.

일반적으로 IV는 암호화 된 데이터의 앞과 뒤를 넣습니다. GameScripting의 대답은이를 수행하는 한 가지 방법을 보여줍니다.

마지막으로 주요 파생물은 의심 스럽지만 불완전하므로 거기에서해야 할 일을 말할 수는 없습니다.

+0

GameScripting의 대답을 다시 한 번 살펴볼 필요가 있다고 생각합니다. –

+0

키 파생에 관해서는, SHA256 출력을 16 바이트로 줄이기 위해 MD5보다 나쁜 방법이 있습니다. ['Rfc2898DeriveBytes'] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx)를 사용하면 분명히 그것을 능가합니다. –

+0

@CodesInChaos : 답변 해 주셔서 감사합니다.이 문제를 해결하는 데 어려움이있는 이유는 무엇입니까? 어떻게 CBC로 전환 할 수 있을까요? – Maven