2012-08-27 79 views
1

我正在使用Blowfish算法對我的文件進行加密,但似乎我不知道有關它的一些信息。每當我嘗試Encipher()它會拋出一個異常,說'無效的長度'。我認爲,當它獲得8的mod時,長度必須爲零,並且我認爲這意味着應該有8×8的數據流塊開始加密。我該怎麼辦?Blowfish無效長度例外

河豚的:編碼方法:

public void Encipher(byte[] data, int length) 
{ 
    uint xl, xr; 
    if ((length % 8) != 0) <-- Exception Line 
     throw new Exception("Invalid Length"); 
    for (int i = 0; i < length; i += 8) 
    { 
     // Encode the data in 8 byte blocks. 
     xl = (uint)((data[i] << 24) | (data[i + 1] << 16) | (data[i + 2] << 8) | data[i + 3]); 
     xr = (uint)((data[i + 4] << 24) | (data[i + 5] << 16) | (data[i + 6] << 8) | data[i + 7]); 
     Encipher(ref xl, ref xr); 
     // Now Replace the data. 
     data[i] = (byte)(xl >> 24); 
     data[i + 1] = (byte)(xl >> 16); 
     data[i + 2] = (byte)(xl >> 8); 
     data[i + 3] = (byte)(xl); 
     data[i + 4] = (byte)(xr >> 24); 
     data[i + 5] = (byte)(xr >> 16); 
     data[i + 6] = (byte)(xr >> 8); 
     data[i + 7] = (byte)(xr); 
    } 
} 

我的加密方法:

private void EncryptFile(string szFilePath, string szInfoFile, string szKey, string szEncryptedFile = "") 
     { 
      // Blowfish 
      Blowfish alg = new Blowfish(Encoding.Unicode.GetBytes(szKey)); 

      // Open file 
      System.IO.FileStream originalStream = System.IO.File.OpenRead(szFilePath); 

      // Store original file length 
      long originalLength = originalStream.Length; 
      System.IO.File.WriteAllText(szInfoFile, originalLength.ToString()); 

      Byte[] buffer = new byte[originalStream.Length + (originalStream.Length % 8)]; 
      originalStream.Read(buffer, 0, buffer.Length); 
      originalStream.Close(); 

      // Encrypt 
      alg.Encipher(buffer, buffer.Length); 

      string szEncFile; 

      if (szEncryptedFile != string.Empty) szEncFile = szEncryptedFile; else szEncFile = szFilePath; 

      System.IO.FileStream stream = new System.IO.FileStream(szEncFile, System.IO.FileMode.Create); 
      stream.Write(buffer, 0, buffer.Length); 
      stream.Close(); 
     } 

感謝。

+5

如果您想對問題進行良好診斷,請顯示導致此情況的代碼。 –

+0

我建議您不要試圖實施您自己使用http://www.bouncycastle.org/csharp/的Encipher方法。 –

+0

我與Blowfish周圍如此,感謝有關報價。 – MahanGM

回答

3

如果你想要做的是一輪價值高達8整除的下一個值,那麼你應該這樣做,而不是:

Byte[] buffer = new byte[originalStream.Length + (8-(originalStream.Length % 8))]; 
+0

感謝您的更正。它正在工作。 – MahanGM

2

Peter Ritchieanswered它。不過,下面應該考慮一些慣用的東西。一種方法是在using塊中包裝IDisposable實現的類(如FileStream),以確保在處理期間出現異常情況時處理資源。另一個是你放在一行中的if..then。這真的很奇怪。我用三元運算符取代了它,這似乎符合您使用的用法。祝你好運。

private void EncryptFile(string szFilePath, string szInfoFile, string szKey, string szEncryptedFile = "") 
    { 
     // Blowfish 
     Blowfish alg = new Blowfish(Encoding.Unicode.GetBytes(szKey)); 

     // Open file 
     using (System.IO.FileStream originalStream = System.IO.File.OpenRead(szFilePath)) 
     { 
      // Store original file length 
      long originalLength = originalStream.Length; 
      System.IO.File.WriteAllText(szInfoFile, originalLength.ToString()); 

      Byte[] buffer = new byte[originalStream.Length + (originalStream.Length % 8)]; 
      originalStream.Read(buffer, 0, buffer.Length); 
     } 

     // Encrypt 
     alg.Encipher(buffer, buffer.Length); 

     string szEncFile; 

     szEncFile = string.IsNullOrEmpty(szEncryptedFile) ? szFilePath : szEncryptedFile; 

     using (System.IO.FileStream stream = new System.IO.FileStream(szEncFile, System.IO.FileMode.Create)) 
     { 
      stream.Write(buffer, 0, buffer.Length); 
     } 
    } 
+0

謝謝。 'FileStream'和'if..then'塊只是一個測試,沒有什麼嚴重的。 – MahanGM