如何将Rijndael加密与.Net Core类库一起使用?(不是.Net Framework)
本文关键字:Net Framework 不是 一起 类库 Rijndael 加密 Core | 更新日期: 2023-09-27 17:56:41
我们如何在.Net Core类库中使用Rijndael加密?(不是 .Net 框架类库) 我们需要创建一个共享的.Net Core库,以便在多个项目中使用,并且需要实现跨项目使用相同的Rijndael加密的加密和解密方法。
我们目前使用:
- VS 企业版 2015
- C#
- .Net Core 类库
- .NETStandard, 版本=v1.6 参考
看来 .Net Core 1.0 版本中缺少 Rijndael 和 AES 的实现......它似乎只包括基类。 我们如何获得Rijndael或AES加密的.Net Core实现作为对新的.Net Core类库项目的引用?
以下是在.Net Framework 4.5.2中工作的加密方法:
public static string Encrypt(string valueToEncrypt, string symmetricKey, string initializationVector)
{
string returnValue = valueToEncrypt;
var aes = new System.Security.Cryptography.RijndaelManaged();
try
{
aes.Key = ASCIIEncoding.ASCII.GetBytes(symmetricKey);
aes.IV = ASCIIEncoding.ASCII.GetBytes(initializationVector);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.ISO10126;
var desEncrypter = aes.CreateEncryptor();
var buffer = ASCIIEncoding.ASCII.GetBytes(valueToEncrypt);
returnValue = Convert.ToBase64String(desEncrypter.TransformFinalBlock(buffer, 0, buffer.Length));
}
catch (Exception)
{
returnValue = string.Empty;
}
return returnValue;
}
Rijndael和AES之间的区别(在.NET中)在于Rijndael允许块大小更改,但AES不允许。由于RijndaelManaged的默认块大小与AES块大小(128位/16字节)相同,因此您实际上使用的是AES。
无需按名称实例化实现类型,只需使用工厂 ( Aes.Create()
)。 这适用于.NET Core和.NET Framework。
其他值得一提的事情:
- 所有 SymmetricAlgorithm 实例都是可 IDposable,您应该在
using
语句中使用它们。 - 所有 ICryptoTransform 实例(例如您错误命名的
desEncryptor
)都是可识别的,您应该在using
语句中使用它们。 - ISO10126填充在 .NET Core 1.0 中不可用。如果需要与现有流兼容,可以自行应用填充并指定 PaddingMode.None。否则,PKCS7 更标准。
- 您的 AES 密钥不是很随机,因为它来自 ASCII 字符串(很多值将无效)。
- Base64 至少具有全值范围
- PBKDF2(基于密码的密钥派生函数 2)通过 Rfc2898DeriveBytes 类允许共享字符串秘密输入,可预测的噪声输出。
- KeyAgreement通常更好,但ECDH和经典DH在.NET Core 1.0中都不可用。
- 通常,加密器应该计算随机IV(如果使用相同的对象进行多个操作,则调用
aes.GenerateIV()
)并将其与密文一起呈现。 因此,加密需要密钥和明文并生成密文和IV。 解密获取(密钥、IV、密文)并生成明文。
如果您只想加密/解密内容,请避免直接使用 Rijndael asp.net 因为核心有一些更好的包装器,这些包装器更容易使用,并且默认情况下更有可能得到适当的保护。它被称为数据保护。
using Microsoft.AspNetCore.DataProtection;
// During startup add DP
serviceCollection.AddDataProtection();
...
// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("Contoso.MyClass.v1");
}
...
// protect the payload
string protectedPayload = _protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
...
// unprotect the payload
string unprotectedPayload = _protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
有关详细信息,请参阅数据保护文档