2012-03-22 5 views
0

파일에 쓰는 것과 일치하지 않으므로 문제가 간단합니다. 일부 텍스트를 암호화하고 그것을 배열의 바이트와 같은 File에 쓰고 싶습니다. File의 내용을 읽고 parametr을 다른 바이트로 해독하여 문자열의 바이트를 해독합니다. 메서드 암호화 및 암호 해독 제대로 작동하지만 그것을 던지기 FILE에서 바이트 배열을 사용할 때 예외. 바이트 배열을 읽을 때 바이트 배열을

private static byte[] EncryptString(string text,byte[] key,byte[] vektor) 
    { 
     byte[] array=null; 
     // Check arguments. 
     if (text == null || text.Length <= 0) 
      throw new ArgumentNullException("plainText"); 
     if (key == null || key.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     if (vektor == null || vektor.Length <= 0) 
      throw new ArgumentNullException("Vektor"); 
     try 
     { 
      using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider()) 
      { 
       provider.Key = key; 
       provider.IV = vektor; 
       using (MemoryStream memory = new MemoryStream()) 
       { 
        using (CryptoStream crypto = new CryptoStream(memory, provider.CreateEncryptor(provider.Key, provider.IV), CryptoStreamMode.Write)) 
        { 
         using (StreamWriter writer = new StreamWriter(crypto)) 
         { 
          writer.WriteLine(text); 
         } 
        } 
        array = memory.ToArray(); 
       } 
      } 
     } 
     catch (ArgumentNullException e) 
     { 
      Console.WriteLine("Error in EncryptString {0}", e.Message); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error in EncryptString {0}", e.Message); 
     } 
     return array; 
    } 

는 문자열이 방법 Ecnrypt 바이트 배열은

private static string DecryptByte(byte[] text, byte[] key, byte[] vektor) 
    { 
     string result = null; 
     // Check arguments. 
     if (text == null || text.Length <= 0) 
      throw new ArgumentNullException("plainText"); 
     if (key == null || key.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     if (vektor == null || vektor.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     try 
     { 
      using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider()) 
      { 
       provider.Key=key; 
       provider.IV=vektor; 
       using (MemoryStream memory = new MemoryStream(text)) 
       { 
        using (CryptoStream crypto = new CryptoStream(memory, provider.CreateDecryptor(provider.Key, provider.IV), CryptoStreamMode.Read)) 
        { 
         using (StreamReader read = new StreamReader(crypto)) 
         { 
          result=read.ReadToEnd(); 
         } 
        } 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine("Error in DecryptByte:{0}"+e.Message); 
     } 
     return result; 
    } 

그럼 난 암호화 텍스트를 저장 한 후 버튼을

private void buttonDecrypt_Click(object sender, RoutedEventArgs e) 
    { 
     byte[] text=null,helper=null; 
     string result = null; 
     try 
     { 
      using (FileStream filestream = File.OpenRead(path)) 
      { 
       helper = new byte[filestream.Length]; 
       filestream.Read(helper, 0, (int)filestream.Length); 
      } 
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider()) 
        { 
         result = DecryptByte(helper, provider.Key, provider.IV); 
        } 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("Error v ButtonDecrypt.{0}_____{1}",ex.Message,ex.Data); 
     } 
    } 

을 누르면 그래서 내 문제는 내가 읽고 그 데이터는 파일이 동일하지 않으며 DecryptByte 예외가 발생했습니다. 당신이 나를 도울 수? EDIT yeah 예외 메시지가 유효하지 않습니다. 데이터

+4

예외 (정확하게) 기능 등을 보장한다? 또한 코드가 엉망입니다. GUI와는 별도로 독해/작성 코드를 독자적으로 추출해야합니다. 책임을 더 잘 분리하기 위해 코드를 리팩토링하면 이러한 종류의 문제를 디버그하는 데 많은 도움이됩니다. – tomfanning

+0

예외가 말하는 내용을 알려 주실 수 있습니까? –

+0

내기! 채우기가 잘못되어 제거 할 수 없습니다! – Steve

답변

0

귀하의 buttonDecrypt_Click의 코드는 귀하의 Decryptor의 키 및 IV 속성을 초기화하지 않습니다.
이것이 귀하의 예외의 원인이라고 생각됩니다.

또한 암호 작성 및 암호 해독 방법에 다른 문제가 있다고 생각합니다. DESCryptoServiceProvider는 SymmetricAlgorithm을 둘러싼 래퍼입니다. 즉, 동일한 크기의 블록으로 바이트를 암호화합니다. 따라서 입력 데이터는 블록 크기의 정확한 배수 여야합니다. 이것은 항상 일어나지 않을 것입니다. 그런 다음 padding을 사용해야합니다.

provider.Padding = PaddingMode.PKCS7; 

그것을 던지고 코드의 라인 올바른 블록 (도 물론 해독 필요) 암호화 된 바이트 크기

+0

속성을 초기화 할 필요가 없습니다. ME는이 코드에서 잘 동작합니다. (DESCryptoServiceProvider = 새로운 DESCryptoServiceProvider()) { byte = EncryptString (textik, prov.Key, prov.IV); 텍스트 = DecryptByte (bajt, prov.Key, prov.IV); } '텍스트는 암호화 전과 동일합니다. 그래서 내가 파일을 쓰거나 읽을 때 어딘가에 실수를한다. –

+0

나는 예외를 복제하려고 시도했지만 확실히 동일한 예외가 발생했습니다. 하지만 문제는 두 개의 서로 다른 DESCriptoServiceProvider 인스턴스를 사용했다는 것입니다. 이 두 가지 속성에는 다른 키와 IV 값이 포함되어 있습니다. 따라서 같은 인스턴스로 암호화 한 다음 해독하면 (이전 주석과 같이) 예외가 발생하지 않지만 두 개의 서로 다른 DESCryptoServiceProvider (두 개의 서로 다른 button_click 이벤트에서)를 생성하면 해독 할 수 없습니다 첫 번째 인스턴스로 파일을 암호화합니다. – Steve

+0

오, 이런, 어리석은 실수와 나는 이것을 2 일 동안 풀려고 노력했다. 대단히 고맙습니다. 제가 코드를 다시 작성하는 방법이라고 생각합니다. –

관련 문제