2012-03-22 157 views
0

不一致,所以我的問題很簡單。我想加密一些文本,並將其寫入文件,如數組的字節,並且比我需要讀取文件的內容,並獲取像參數到另一個方法解密數組字節的字符串。 方法加密和解密工作正常我嘗試它,但是當我從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引發異常。你可以幫幫我嗎? 編輯是啊異常消息是無效的數據

+4

有什麼異常(精確),以及哪一行代碼是把它扔?此外,你的代碼有點混亂 - 你應該真正將你的讀/寫代碼從他們自己的方法中提取出來,與GUI分開。重構代碼以更好地分離責任將有助於您嘗試調試這類問題。 – tomfanning 2012-03-22 22:30:29

+0

你能告訴我們什麼例外說? – 2012-03-22 22:34:18

+0

我敢打賭!填充無效,無法刪除! – Steve 2012-03-22 22:39:10

回答

0

您的buttonDecrypt_Click中的代碼不初始化您的Decryptor的密鑰和IV屬性。
我懷疑這是你例外的原因。

此外,我認爲你有加密和解密方法的另一個問題。 DESCryptoServiceProvider是一個SymmetricAlgorithm的包裝。這意味着它以相同大小的塊加密字節。所以輸入數據需要是塊大小的精確倍數。這不會一直髮生。然後需要使用padding

provider.Padding = PaddingMode.PKCS7; 

將確保加密字節的正確塊大小(也需要在過程的解密)

+0

屬性不需要初始化。 MEthods在這段代碼中工作正常。使用(DESCryptoServiceProvider prov = new DESCryptoServiceProvider()) byte = EncryptString(textik,prov.Key,prov.IV); text = DecryptByte(bajt,prov.Key,prov.IV); }'文本與之前的加密相同。所以我氣的錯誤是當我寫或從文件讀取數據的地方。 – 2012-03-23 18:09:56

+0

我試圖複製異常,當然,我得到了同樣的異常。但問題是我使用了兩個不同的DESCriptoServiceProvider實例。這兩個istances包含不同的Key和IV值。因此,如果你使用相同的實例加密然後解密,(如你之前的評論),你不會得到任何異常,但是如果你創建兩個不同的DESCryptoServiceProvider(可能在兩個不同的button_click事件中),你將無法解密該文件用第一個實例加密。 – Steve 2012-03-23 19:51:48

+0

哦,我的上帝,這麼愚蠢的錯誤,我試着解決這個問題2天。非常感謝你,我想我重新編寫方法。 – 2012-03-23 20:51:17