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。
我猜在''name'是BlowfishDecrypt'從'BlowfishEncrypt'編碼的密文。如果是這樣,你的編碼不匹配。您在加密過程中將密文編碼爲十六進制,但在解密期間嘗試從Base64解碼。選擇一種編碼並堅持下去。 –
是的,對不起。 BlowfishEncrypt()的結果就是「name」的例子。 你說的是有道理的,但我不完全確定如何解決它。我改變了'byte [] out1 = Convert.FromBase64String(name);'to'byte [] out1 = Encoding.GetBytes(name);'但是得到相同的錯誤。 – p0laris
這是漫長的一天......應該明顯是'Hex.Decode(name)'。 謝謝你的幫助! – p0laris