2016-10-17 90 views
0

我試圖解密用BouncyCastle的河豚加密的字符串在C#中。C#充氣城堡河豚解密 - 暫存區塊損壞

我能夠很容易地加密和解密我自己的字符串,但不幸的是,我必須解密由另一個系統生成的字符串。

我可以使用下面的,但我還沒有成功解密,重新用C#/ BouncyCastle的是相同的字符串。

using Org.BouncyCastle.Crypto.Engines; 
    using Org.BouncyCastle.Crypto.Paddings; 
    using Org.BouncyCastle.Crypto.Parameters; 

...

static readonly Encoding Encoding = Encoding.UTF8; 

    public string BlowfishEncrypt(string strValue, string key) 
    { 
     try 
     { 
      BlowfishEngine engine = new BlowfishEngine(); 

      PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(engine); 

      KeyParameter keyBytes = new KeyParameter(Encoding.GetBytes(key)); 

      cipher.Init(true, keyBytes); 

      byte[] inB = Encoding.GetBytes(strValue); 

      byte[] outB = new byte[cipher.GetOutputSize(inB.Length)]; 

      int len1 = cipher.ProcessBytes(inB, 0, inB.Length, outB, 0); 

      cipher.DoFinal(outB, len1); 

      return BitConverter.ToString(outB).Replace("-", ""); 
     } 
     catch (Exception) 
     { 
      return ""; 
     } 
    } 

下面是我對此刻的解密。 「損壞的焊盤塊」失敗,出現錯誤的行是cipher.DoFinal(out2, len2);

public string BlowfishDecrypt(string name, string keyString) 
    { 


     BlowfishEngine engine = new BlowfishEngine(); 
     PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(engine); 

     StringBuilder result = new StringBuilder(); 

     cipher.Init(false, new KeyParameter(Encoding.GetBytes(keyString))); 

     byte[] out1 = Convert.FromBase64String(name); 
     byte[] out2 = new byte[cipher.GetOutputSize(out1.Length)]; 

     int len2 = cipher.ProcessBytes(out1, 0, out1.Length, out2, 0); 

     cipher.DoFinal(out2, len2); //Pad block corrupted error happens here 

     String s2 = BitConverter.ToString(out2); 

     for (int i = 0; i < s2.Length; i++) { 
      char c = s2[i]; 
      if (c != 0) { 
       result.Append(c.ToString()); 
      } 
     } 

     return result.ToString(); 

    } 

任何想法,我可能在BlowfishDecrypt做錯了()?

注: 我轉換上述從BouncyCastle的Java示例我發現某處(加密和解密);加密工作。我能看到的唯一區別是Java示例在使用StringBuilder的地方使用StringBuilder。

+0

我猜在''name'是BlowfishDecrypt'從'BlowfishEncrypt'編碼的密文。如果是這樣,你的編碼不​​匹配。您在加密過程中將密文編碼爲十六進制,但在解密期間嘗試從Base64解碼。選擇一種編碼並堅持下去。 –

+0

是的,對不起。 BlowfishEncrypt()的結果就是「name」的例子。 你說的是有道理的,但我不完全確定如何解決它。我改變了'byte [] out1 = Convert.FromBase64String(name);'to'byte [] out1 = Encoding.GetBytes(name);'但是得到相同的錯誤。 – p0laris

+0

這是漫長的一天......應該明顯是'Hex.Decode(name)'。 謝謝你的幫助! – p0laris

回答

0

謝謝Artjom乙!

byte[] out1 = Convert.FromBase64String(name); 

本來應該

byte[] out1 = Hex.Decode(name); 

從那裏,我不得不做的是轉換十六進制的字符串。