当前位置: 首页 > 知识库问答 >
问题:

c#Bouncy Castle河豚解密-键盘块损坏

濮阳原
2023-03-14

我正在尝试用C#中的Bouncycastle解密一个河豚加密字符串。

我可以很容易地加密和解密我自己的字符串,但不幸的是,我必须解密由另一个系统生成的字符串。

我可以使用下面的代码用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。###################################################################################################

    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()中可能做错了什么吗?

注意:我从我在某处找到的BouncyCastleJava示例中转换了上述内容(加密和解密);加密程序可以工作。我能看到的唯一区别是Java示例使用了StringBuffer,而我使用的是StringBuilder。


共有1个答案

郎琪
2023-03-14

谢谢你, Artjom B!

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

应该是

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

从那以后,我所要做的就是将十六进制转换成字符串。

 类似资料:
  • 关于设置config.inc.php,官方phpMyAdmin文档说 河豚的秘密是什么?我如何生成或选择一个值?

  • 在我的windows Phone8应用程序中,我需要使用desede/cbc/pkcs5padding和PBKDF2密钥加密-解密数据。 我找到了如何使用Bouncy Castle加密的示例: http://www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/ 并且我能够加密我的数据(文本),但是我不能

  • 我目前正在将我的C#AES-GCM密码代码转换为PHP。然而,经过一些研究,我的PHP系统加密的文本不能被C#one解密。我想知道这两种代码是否有区别: C#带弹跳壳: 下面是PHP系统: 有没有人能告诉我,PHP代码中是否有遗漏或不同之处,导致它们的工作方式有所不同?或者PHP函数和BouncyCastle函数之间是否存在某种内部差异,从而使它们有所不同?

  • 我尝试解密从Web服务接收的加密数据。 使用AES 128进行加密。 我使用以下代码对数据进行解密: 在 密码doFinal() 我得到了以下例外: javax.crypto.badpaddingexception垫块损坏 我浏览了我的帖子,但没有找到解决办法。我被困在这里了。

  • -IV是相同的,因为目前它是静态变量,用于测试目的。 -密码设置为AES/CBC/PKCS5Padding -键设置为AES 编辑 添加IV发生器方法