如何在C#中使用blowfish解密十六进制字符串?

时间:2014-09-05 02:42:15

标签: c# bouncycastle blowfish

因此,我已经完成了一项任务,要求证明可以解密使用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的文档使得那些对加密经验/理解有限的人来说非常难以正确使用它。但是我们可能希望将来能够实现这一目标,所以如果有人能指出正确的方向,我仍然感兴趣。

1 个答案:

答案 0 :(得分:0)

您忽略了第一个块的解密(来自ProcessBytes())。

<击> 您应该使用CryptoStream

,而不是直接使用密码对象
using (var reader = new StreamReader(new CryptoStream(new MemoryStream(input), cipher, CrytoStreamMode.Read))
    Console.WriteLine(reader.ReadToEnd());

<击>

BouncyCastle没有实现ICryptoTransform,所以你需要自己连接每个调用的结果。