【问题标题】:How do I decrypt a hex string using blowfish in C#?如何在 C# 中使用河豚解密十六进制字符串?
【发布时间】:2014-09-09 09:56:12
【问题描述】:

因此,我得到了一项任务,以证明可以解密以十六进制字节表示的字符串,该字符串已使用 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 类中调整它。谁能指出我想做的一个好例子的方向?

我认为我遇到的至少一个问题是密钥 - 它看起来不像是十六进制格式,但我不知道如何处理它。

更新:

我还尝试了与 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(显然)缺乏文档,这使得那些对加密经验/理解有限的人很难正确使用它。但是,我们可能希望在未来实现这一目标,所以如果有人能指出正确的方向,我仍然很感兴趣。

【问题讨论】:

  • 你有什么问题?
  • 基本上它不是在解密字符串,我不知道从哪里开始找出原因。
  • 那么会发生什么?会爆炸吗?
  • 不,它只是输出一些不可读的东西。
  • 那么你的加密和解密不匹配。检查你的静脉注射。

标签: c# bouncycastle blowfish


【解决方案1】:

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

与其直接使用密码对象,不如使用CryptoStream:

using (var reader = new StreamReader(new CryptoStream(new MemoryStream(input), cipher, CrytoStreamMode.Read))
    Console.WriteLine(reader.ReadToEnd());

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

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多