gpt4 book ai didi

C# Bouncy CaSTLe 不解密,异常 : pad block corrupted

转载 作者:行者123 更新时间:2023-11-30 22:06:17 25 4
gpt4 key购买 nike

在我的 Windows Phone 8 应用程序中,我需要使用 DESede/CBC/PKCS5Padding 和 PBKDF2 key 加密解密数据。
我找到了如何使用 Bouncy CaSTLe 进行加密的示例:
http://www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/
而且我能够加密我的数据(文本),但我无法使用此代码解密我的加密数据。当我尝试调用 DoFinal() 时,它抛出异常“pad block corrupted”。
也许我在解密时遗漏了什么?
也许有人知道 Windows Phone 8 上使用 DESede/CBC/PKCS5Padding 和 PBKDF2 key 进行加密的替代库(方式)?

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 };
}
}
}

最佳答案

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

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

我不知道为什么,但我在密码中使用 DesEdeEngine 的相同对象来解密并不重要。

简而言之,默认情况下 DesEdeEngine 被初始化为解密器,而不是加密,而是解密填充字节 block 。当 DoFinal() 中的 PaddedBufferedBlockCipher 调用 PadCount() 时,最后一个字节的值必须 > 0 且 < 8 我得到的值类似于 48 或 123 或类似的东西,它抛出了一个异常“pad block corrupted”。

感谢所有参与的人。

关于C# Bouncy CaSTLe 不解密,异常 : pad block corrupted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23740422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com