gpt4 book ai didi

c# - 为什么 RijndaelManaged 和 AesCryptoServiceProvider 返回不同的结果?

转载 作者:IT王子 更新时间:2023-10-29 04:06:13 26 4
gpt4 key购买 nike

这是我运行的示例。它具有相同的Mode、Padding、BlockSize、KeySize。我使用相同的初始化向量、 key 和数据。

使用 RijndaelManaged 生成加密值:0x8d,0x81,0x27,0xc6,0x3c,0xe2,0x53,0x2f,0x35,0x78,0x90,0xc2,0x2e,0x3b,0x8a,0x61,0x41,0x47,0xd6,0xd0,0xff,0x92,0x72,0x3d,0xc6,0x16,0x2b,0xd8,0xb5,0xd9,0x12,0x85

使用 AesCryptoServiceProvider 生成加密值:0x8d,0x9f,0x6e,0x99,0xe9,0x54,0x8b,0x12,0xa9,0x88,0x1a,0x3d,0x65,0x23,0x9c,0x4e,0x18,0x5a,0x89,0x31,0xf5,0x75,0xc5,0x9e,0x0d,0x43,0xe9,0x86,0xd4,0xf3,0x64,0x3a

这是我用来生成这些结果的代码


public partial class AesTest
{
private SymmetricAlgorithm mEncryptionType;
private byte[] mPrivateKey;
private byte[] mInitializationVector;
private byte[] mData;

public AesTest()
{
mPrivateKey = new byte[32]
{
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22
};

mInitializationVector = new byte[16]
{
0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33
};

mData = new byte[16]
{
0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44
};

mEncryptionType = new RijndaelManaged();
mEncryptionType.Mode = CipherMode.CFB;
mEncryptionType.Padding = PaddingMode.PKCS7;
mEncryptionType.BlockSize = 128;
mEncryptionType.KeySize = 256;

byte[] rij_encrypted_data = Encrypt(mData);

mEncryptionType = new AesCryptoServiceProvider();
mEncryptionType.Mode = CipherMode.CFB;
mEncryptionType.Padding = PaddingMode.PKCS7;
mEncryptionType.BlockSize = 128;
mEncryptionType.KeySize = 256;

byte[] aes_encrypted_data = Encrypt(mData);
}

public virtual byte[] Encrypt(byte[] unencryptedData)
{
return TransformData(unencryptedData, mEncryptionType.CreateEncryptor(mPrivateKey, mInitializationVector));
}

private byte[] TransformData(byte[] dataToTransform, ICryptoTransform cryptoTransform)
{
byte[] result = new byte[0];
if (dataToTransform != null && cryptoTransform != null && dataToTransform.Length > 0)
{
// Create the memory stream to store the results
MemoryStream mem_stream = new MemoryStream();
// Create the crypto stream to do the transformation
CryptoStream crypto_stream = new CryptoStream(mem_stream, cryptoTransform, CryptoStreamMode.Write);
// bytes are transformed on a write
crypto_stream.Write(dataToTransform, 0, dataToTransform.Length);
// Flush the final block
crypto_stream.FlushFinalBlock();
// Convert the transformed memory stream back to a byte array
result = mem_stream.ToArray();
// Close the streams
mem_stream.Close();
crypto_stream.Close();
}
return result;
}
}

我想我只是想知道我是否错过了什么。

更新: 结果是 AesManaged如果您尝试将 CipherMode 设置为 CFB,将抛出 CryptographicException(“指定的密码模式对此算法无效”)。我觉得 AesCryptoServiceProvider应该做同样的事情,但事实并非如此。 FIPS 认证类允许无效的密码模式似乎很有趣。

最佳答案

微软的回应:

RijndaelManaged 类和 AesCryptoServiceProvider 类有两个 不同的实现。 RijndaelManaged 类是一种 Rijndael算法的实现 在 .net 框架中,这不是 根据 NIST 验证(国家 标准与技术研究所) 密码模块验证 程序(CMVP)。

但是, AesCryptoServiceProvider 类调用 Windows Crypto API,它使用 RSAENH.DLL,并已通过验证 CMVP 中的 NIST。虽然瑞因达尔 算法是 NIST 的赢家 选择算法的竞争 那会变成AES,有一些 Rijndael 和 官方 AES。所以, RijndaelManaged 类和 AesCryptoServiceProvider 类有 实现上的细微差别。

此外,RijndaelManaged 类 无法提供等价物 使用 AES 实现。有 在 .net 中实现的另一个类 框架,AesManaged 类。这个 刚刚包装的类 RijndaelManaged 具有固定 block 大小的类和 实现 AES 的迭代次数 标准。但是,它不支持 反馈大小,尤其是当 模式设置为CFB或OFB时, CryptographicException 将被抛出。

更多信息请引用 以下 MSDN 文档。

AesManaged ClassAesManaged.Mode Property

如果你想选择标准的 AES 作为 你的安全算法 应用程序,我们建议使用 AesCryptoServiceProvider 类。如果你 想要混合 RijndaelManged 类 和 AesCryptoServiceProvider 类 您的申请,我们建议使用 CBC 模式而不是 CFB 模式 方案,自实现以来 两个类中的 CBC 模式是 一样。

关于c# - 为什么 RijndaelManaged 和 AesCryptoServiceProvider 返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/957388/

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