在.NET内核中实现RSA

qjp7pelc  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(151)

我正在尝试使用RSA加密和解密一些数据。我查找了RSA类,但只看到抽象类https://msdn.microsoft.com/en-us/library/system.security.cryptography.rsa(v=vs.110).aspx
我读到DNX5中的RSA类与.net 4.6.1中的RSA类不同,这与我看到的不同吗?如果是,我在哪里可以找到使用该类的文档?而且RSACryptoServiceProvider似乎在.net核心中不工作,我只能访问RSA抽象类。

50pmv0ei

50pmv0ei1#

如果可以的话,应该避免使用RSACryptoServiceProvider。它只在Windows上工作(而且它是Windows上不太好的RSA实现)。坚持使用RSA基类,并通过RSA.Create()创建新示例

临时密钥(创建)

.NET核心

using (RSA rsa = RSA.Create())
{
    rsa.KeySize = desiredKeySizeInBits;

    // when the key next gets used it will be created at that keysize.
    DoStuffWithThePrivateKey(rsa);
}

.NET框架版本〈= 4.7.1
不幸的是,.NET Framework上的RSA.Create()的默认值是RSACryptoServiceProvider,它不考虑set_KeySize。因此,如果您需要临时密钥,则需要在.NET Framework和.NET Core上使用不同的代码:

using (RSA rsa = new RSACng())
{
    rsa.KeySize = desiredKeySizeInBits;

    DoStuffWithThePrivateKey(rsa);
}

或者,如果您需要支持4.6(其中不存在RSAng)/ 4.6.2(其中大多数.NET Framework都可以很好地使用RSAng对象而不是RSACryptoServiceProvider对象)之前的版本,则可以继续使用旧的实现:

using (RSA rsa = new RSACryptoServiceProvider(desiredKeySizeInBits))
{
    // Since before net46 the Encrypt/Decrypt, SignData/VerifyData, SignHash/VerifyHash
    // methods were not defined at the RSA base class, you might need to keep this strongly
    // typed as RSACryptoServiceProvider.
    DoStuffWithThePrivateKey(rsa);
}

.NET框架〉= 4.7.2
这里我们有一个重载Create(Int32),它允许指定一个密钥大小,并且在Windows上返回一个现代RSACng的示例。但是要注意:无参数重载Create()仍然返回过期的RSACryptoServiceProvider

临时密钥(导入)

尽管RSACng通常比RSACryptoServiceProvider更易于使用,但RSACryptoServiceProvider在此上下文中应该可以很好地工作,因此RSA.Create()在所有平台上都很好:

using (RSA rsa = RSA.Create())
{
    rsa.ImportParameters(rsaParameters);

    DoStuffWithWhateverKindOfKeyYouImported(rsa);
}

从证书:

.NET核心1.0以上版本、.NET框架4.6以上版本

using (RSA rsa = cert.GetRSAPublicKey())
{
    DoStuffWithThePublicKey(rsa);
}

using (RSA rsa = cert.GetRSAPrivateKey())
{
    DoStuffWithThePrivateKey(rsa);
}

.NET框架版本低于4.6

// Do NOT put this in a using block, since the object is shared by all callers:
RSA rsaPrivate = (RSA)cert.PrivateKey;
DoStuffWithThePrivateKey(rsaPrivate);

// Do NOT put this in a using block, since the object is shared by all callers:
RSA rsaPublicOnly = (RSA)cert.PublicKey.Key;
DoStuffWithThePublicKey(rsaPublic);

使用命名/持久键(仅限Windows)

我打算包括一些关于RSACryptoServiceProvider(WinXP+/CAPI)和RSACng(Win7+/CNG)创建/打开命名密钥的示例,但这在.NET中并不常见;而且它肯定不是可移植的(对其他操作系统的可移植性是. NETCore的一个更有说服力的论点)。

引用事物。

对于.NET Core 1.0和1.1,您可以从System.Security.Cryptography.Algorithms包访问RSA基类。在.NET Core 2.0中,它将包含在netstandard包引用中。
如果你 * 需要 * 与操作系统进行复杂的互操作,你可以引用System.Security.Cryptography.Cng(Windows CNG)、System.Security.Cryptography.Csp(Windows CAPI/CryptoServiceProvider)或System.Security.Cryptography.OpenSsl(Linux OpenSSL、macOS OpenSSL),并访问支持互操作的类(RSAng、RSACryptoServiceProvider、RSAOpenSsl)。

RSA.Create()返回什么?

  • .NET框架版本〈= 4.7.1:RSACryptoServiceProvider,除非由CryptoConfig更改。
  • .NET框架〉= 4.7.2:同上。但是有一个新的Create(Int32)重载,它接受一个键大小,并在Windows上返回一个RSACng
  • .NET核心(Windows):一个通过CNG实现RSA的私有类,你不能将它强制转换为任何更具体的类型。
  • .NET核心(Linux):通过OpenSSL实现RSA的私有类,不能将其强制转换为任何更具体的类型。
  • .NET核心(macOS):一个通过OpenSSL实现RSA的私有类,不能将其强制转换为任何更具体的类型。(这应该通过下一版本的.NET Core中的SecureTransforms来实现)
vfh0ocws

vfh0ocws2#

您将需要使用dotnetcore库。将System.Security.Cryptography.Algorithms Nuget包添加到您的项目中。您可以在此处找到它:System.Security.Cryptography.Algorithms
它为您的项目提供了所有常见的算法。
下面是用于Encrypt()和Decrypt()方法的RSACryptoServiceProvider class

相关问题