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

C#Bouncy Castle不解密,异常:pad块损坏

宗政唯
2023-03-14

在我的windows Phone8应用程序中,我需要使用desede/cbc/pkcs5padding和PBKDF2密钥加密-解密数据。
我找到了如何使用Bouncy Castle加密的示例:
http://www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/
并且我能够加密我的数据(文本),但是我不能使用此代码解密我加密的数据。当我试图调用DoFinal()时,它抛出异常“pad block corrupted”。
也许我在解密时遗漏了什么?
也许有人知道windows Phone8上使用desede/cbc/pkcs5padding和PBKDF2密钥进行加密的替代库(方法)?

using Raksha.Crypto;
using Raksha.Crypto.Engines;
using Raksha.Crypto.Modes;
using Raksha.Crypto.Paddings;
using Raksha.Crypto.Parameters;
using System;
using System.Security.Cryptography;
using System.Text;

namespace MyNamespace
{
  class EncryptDecrypt
  {
      Rfc2898DeriveBytes key;
      BufferedBlockCipher cipherEncrypt;
      BufferedBlockCipher cipherDecrypt;
      private readonly int ITERACTIONCOUNT = 1000;
      private readonly int KEY_LENGTH = 24; 

      public EncryptDecrypt(string passPhrase, string salt)
      {
          byte[] SALT = Encoding.UTF8.GetBytes(salt);
          key = new Rfc2898DeriveBytes(passPhrase, SALT, ITERACTIONCOUNT);

          DesEdeEngine desede = new DesEdeEngine();

          cipherEncrypt = new PaddedBufferedBlockCipher(new CbcBlockCipher(desede));
          cipherDecrypt = new PaddedBufferedBlockCipher(new CbcBlockCipher(desede));
          DesEdeParameters p = new DesEdeParameters(key.GetBytes(KEY_LENGTH));

          cipherEncrypt.Init(true, p);
          cipherDecrypt.Init(false, p);
      }

  public byte[] Encrypt(byte[] dataToEncrypt)
      {
          try
          {
              byte[] outbytes = cipherEncrypt.DoFinal(dataToEncrypt);
              return outbytes;
          }
          catch(Exception ex)
          {
              System.Diagnostics.Debug.WriteLine("Encrypt() Exception: " + ex.Message);
              return new byte[] { 0 };
          }
      }

      public byte[] Decrypt(byte[] dataToDecrypt)
      {
          try
          {
              byte[] result = cipherDecrypt.DoFinal(dataToDecrypt);
              return result;
          }
          catch(CryptoException ex)
          {
              System.Diagnostics.Debug.WriteLine("Decrypt() Exception: " + ex.Message);
      // ex.Message: pad block corrupted
              return new byte[] { 0 };
          }
      }
   }

共有1个答案

楚硕
2023-03-14

我解决了这个问题!
必须用第一个参数true初始化DesEdeEngine。

DesEdeEngine desede = new DesEdeEngine();
desede.Init(true, key);

我不知道为什么,但我在密码中使用相同的DesEdeEngine对象来解密并不重要。简而言之,默认情况下DesEdeEngine被初始化为decryptor,而不是encrypt,而是填充字节的decrypt块。当DoFinal()中的PaddedBufferedBlockCipher调用PadCount(),其中最后一个字节的值必须>0且<8,我得到的值是48或123之类的,它抛出了一个异常“pad block corrupted”。感谢所有参与的人。

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

  • 我被困在一个问题与AES解密在我的Android应用程序。我已经搜索了很多,但无法得到解决方案。 这是步骤,我正在做的。 用我的密钥加密信用卡号并发送到Web服务器 此外,来自服务器的加密信息与我们以加密格式发送的信息不同。在iPhone应用程序中也做了同样的事情,iPhone能够成功地解密信息。 我使用以下代码进行加密和解密。 请建议。 编辑:我还有一件事,那就是工作

  • 问题内容: 在此代码中,此行导致异常: 我从以下位置获得了代码:http : //www.techrepublic.com/blog/software-engineer/attention-android-developers- keep-user-data-safe/ 有任何想法吗? 详细信息:我也在Android上对其进行加密 问题答案: owlstead的建议很有帮助,但是对于这种情况,在使

  • 我正在尝试用C#中的Bouncycastle解密一个河豚加密字符串。 我可以很容易地加密和解密我自己的字符串,但不幸的是,我必须解密由另一个系统生成的字符串。 我可以使用下面的代码用C#/Bouncycastle重新创建相同的字符串,但是我还没有成功地解密它。 ... 下面是我目前解密的内容。错误垫块损坏失败的行是

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