gpt4 book ai didi

c# - CFB 模式下的 TripleDES,C# 和 Crypto++ 不同

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

这是我的问题:我有一个 C++ 遗留代码(使用 crypto++ v5.6.1),我用 C# 开发了一个新代码(使用 System.Security.Cryptography 的 .NET 3.5)。我无法更改 C++ 代码,但我需要能够解密以前加密的数据,并且以前的应用程序必须能够解密我将使用新的 C# 代码加密的数据。

两种情况下使用的算法都是 TripleDES with CFB cipher mode,但最终加密的数据不一样,字节数和第一个字节一样,但除此之外所有其他字节都是不同。

填充是在 C++ 代码中手动完成的(添加零)。所以我将 PaddingValue 设置为 PaddingMode.Zeros。 (我也尝试在 C# 代码中手动在末尾添加零,它没有改变任何东西)。

我尝试使用不同的 System.Text.Encoding,但结果是一样的(事实上,测试的字符是“纯”ASCII(即:介于 0 和 126 之间))。

在 C++ 代码中,MandatoryBlockSize() 的值是 8,所以我也将 FeedbackSize 设置为 8。但如果我理解它写的,它实际上是我的 IV 的大小,不是吗?

key 大小为 24 个字节(3 个不同的 key ),IV 为 8 个字节长。它们在 2 个代码中都是相同的。

如果我在这两种情况下都使用 CBC 模式,结果是相同的(但是,正如我所说,我不能更改遗留代码......),OFB 和 CTS 模式抛出异常(对一个不可用并且不兼容另一个)在我的 .NET 应用程序上,所以我无法比较结果。

我尝试使用 Mono,.Net 版本 3.5 和 4.0,或使用 visual,.Net 3.5 或 4.0,4 个加密结果相同,但与原始结果不同。

现在我真的不知道要测试什么......我宁愿不将 Crypto++ 包装在 C++/CLI 项目中以使用它而不是 System.Security.Cryptography。

有人有建议或可以告诉我哪里做错了吗?

C++代码如下:

void *CryptData(BYTE *bDataIn, LONG lIn, LONG *lOut, byte* key, byte* iv)
{
byte *bIn;
byte *bOut;
LONG l2,lb;

CFB_FIPS_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CFB;
encryption_DES_EDE3_CFB.SetKeyWithIV(key, sizeof(key), iv, sizeof(iv));

lb = encryption_DES_EDE3_CFB.MandatoryBlockSize();
l2 = ((lIn + lb - 1)/lb)*lb;

bIn = (byte*)malloc(l2);
bOut = (byte*)malloc(l2);

memset(bIn,0,l2);
memset(bOut,0,l2);
memcpy(bIn,bDataIn,lIn);

encryption_DES_EDE3_CFB.ProcessString(bOut, bIn, l2);

*lOut = l2;

return bOut;
}

这是 C# 代码:

public FibxCrypt()
{
_cryptoAlgo = new TripleDESCryptoServiceProvider();
//_cryptoAlgo.GenerateKey();
_cryptoAlgo.Key = _key;
//_cryptoAlgo.GenerateIV();
_cryptoAlgo.IV = _iv;
_cryptoAlgo.Mode = CipherMode.CFB;
_cryptoAlgo.Padding = PaddingMode.Zeros;

_encoding = new UTF8Encoding();
}

private MemoryStream EncryptingString(string plainText, out long encryptSize)
{
// Check arguments.
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");

// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = _cryptoAlgo.CreateEncryptor();

// Create the streams used for encryption.
//using (MemoryStream msEncrypt = new MemoryStream())
MemoryStream msEncrypt = new MemoryStream();

encryptSize = ((plainText.Length + _cryptoAlgo.FeedbackSize - 1) / _cryptoAlgo.FeedbackSize) * _cryptoAlgo.FeedbackSize;

using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt, _encoding))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
}

// Return the encrypted memory stream.
return msEncrypt;
}

编辑:我试图直接使用加密器,而不是使用流,但我遇到了同样的问题。

private MemoryStream EncryptingString(string plainText, out long encryptSize)
{
// Check arguments.
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");

ICryptoTransform encryptor = _cryptoAlgo.CreateEncryptor();

byte[] cipherData = encryptor.TransformFinalBlock(
_encoding.GetBytes(plainText), 0, plainText.Length);

// Return the encrypted memory stream.
return msEncrypt;
}

最佳答案

您更改的 FeedBackSize 与 CFB 操作模式相关 (msdn documentation)。因此,您还应该检查 C++ 和 C# 中的反馈大小是否相同。

我认为您的错误可能是 C++ 代码和 C# 代码之间的 BlockSizes。您是否尝试过在 C# 实现中设置 BlockSize = 8?

关于c# - CFB 模式下的 TripleDES,C# 和 Crypto++ 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17112036/

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