如何将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加密与.Net Core类库一起使用?(不是.Net Framework)

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

有关详细信息,请参阅数据保护文档