因此,我已经完成了一项任务,要求证明可以解密使用C#使用Blowfish加密的以十六进制字节表示的字符串。
以下是:
现在也许我有点天真,但我认为这个过程很简单。
即。从网上获取Blowfish实现,然后简单地插入加密密钥和加密文本,它将以可读格式输出字符串。
不幸的是,情况似乎并非如此。在过去的几个小时里,我尝试了几个不同的库,但最终选择了BouncyCastle,因为它似乎是最受欢迎的。然而,没有太多的文档(在这里和其他网站的其他问题中提到),我真的不知道如何完成这项工作。
以下是我所拥有的:
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Utilities.Encoders;
using Org.BouncyCastle.Crypto;
public class CryptTest
{
public void Decrypt()
{
var engine = new BlowfishEngine();
var param = new KeyParameter(System.Text.Encoding.ASCII.GetBytes("sdjerwioukjiefdjewiujewiunjeuwer"));
var input = Hex.Decode("db247cceae61fddbcbb62d00281e0446");
BufferedBlockCipher cipher = new BufferedBlockCipher(engine);
cipher.Init(false, param);
byte[] outBytes = new byte[input.Length];
int len1 = cipher.ProcessBytes(input, 0, input.Length, outBytes, 0);
cipher.DoFinal(outBytes, len1);
Console.WriteLine(System.Text.Encoding.ASCII.GetString(outBytes));
}
}
我试图从BouncyCastle附带的Test类中调整它。任何人都能指出我做我想做的好榜样的方向吗?
我认为至少我遇到的一个问题是关键 - 它看起来不像十六进制格式,但我不知道如何处理它。< / p>
更新:
我还尝试了here的不同库,因为它看起来更接近我想做的事情。
即
BlowFish b = new BlowFish(System.Text.Encoding.ASCII.GetBytes("sdjerwioukjiefdjewiujewiunjeuwer"));
var result1 = b.Decrypt_CBC("db247cceae61fddbcbb62d00281e0446");
var result2 = b.Decrypt_ECB("db247cceae61fddbcbb62d00281e0446");
Console.WriteLine(result1 + "\n" + result2);
但是我仍然得到了胡言乱语。
更新2:
暂时使用更简单的东西。 (明显)缺乏Bouncy Castle的文档使得那些对加密经验/理解有限的人来说非常难以正确使用它。但是我们可能希望将来能够实现这一目标,所以如果有人能指出正确的方向,我仍然感兴趣。
答案 0 :(得分:0)
您忽略了第一个块的解密(来自ProcessBytes()
)。
<击>
您应该使用CryptoStream
:
using (var reader = new StreamReader(new CryptoStream(new MemoryStream(input), cipher, CrytoStreamMode.Read))
Console.WriteLine(reader.ReadToEnd());
击> <击> 撞击>
BouncyCastle没有实现ICryptoTransform
,所以你需要自己连接每个调用的结果。