C# 覆盖RSA对象中的默认算法以支持OaepSHA256填充

C# 覆盖RSA对象中的默认算法以支持OaepSHA256填充,c#,rsa,sha256,rsacryptoserviceprovider,C#,Rsa,Sha256,Rsacryptoserviceprovider,在.Net 4.6中创建RSA或RSACryptServiceProvider对象是默认的KeyExchangeAlgorithmRSA-PKCS1-KeyEx,它只支持OaepSHA1填充 在尝试使用其他填充(如“OaepSHA256”)时获取“指定的填充模式对此算法无效” 是否有一种方法可以将RSA对象中的算法重写为支持此填充的算法,以使其支持所有填充 更新 RSACng工作。在我的场景中,我使用containerkey在机器中存储私钥,在需要时使用RSACryptoServiceProv

在.Net 4.6中创建
RSA
RSACryptServiceProvider
对象是默认的
KeyExchangeAlgorithm
RSA-PKCS1-KeyEx
,它只支持
OaepSHA1
填充

在尝试使用其他填充(如“OaepSHA256”)时获取“指定的填充模式对此算法无效”

是否有一种方法可以将RSA对象中的算法重写为支持此填充的算法,以使其支持所有填充

更新 RSACng工作。在我的场景中,我使用containerkey在机器中存储私钥,在需要时使用RSACryptoServiceProvider使用containerkey名称检索私钥。作为使用RSACng的一种解决方法,我正在导入从rsaccryptoserviceprovider对象导出的属性,如下所示。有更好的方法吗

using (var rsa = new RSACryptoServiceProvider(cspParams))
            {
                using(var rsaCng = new RSACng())
                {
                    rsaCng.ImportParameters(rsa.ExportParameters(true));

                    decryptedResult = rsaCng.Decrypt(encryotedText, RSAEncryptionPadding.OaepSHA256)
                }
            }

RSA
从.NET Framework 4.6开始支持.NET Framework中的
OaepSHA256
,从.NET Framework 1.0开始支持.NET内核中的
OaepSHA1
OaepSHA256
OaepSHA384
OaepSHA512
和PKCS标准1,)

至于在旧版本的.NET Framework中的支持,我认为这是不可能的,因为加密API将加密算法实现视为不透明的黑匣子,没有太多的扩展空间(即,您不能真正对现有实现进行子类化,但您可以很容易地重新实现自己的实现)。我注意到这部分是因为API只是简单地包装了Windows的内置加密功能,这是不透明的(比如
System.Drawing
包装GDI也没有太多扩展空间)

至于“指定的填充模式对此算法无效”错误-问题是您使用的是
rsaccryptoserviceprovider
,而不是
RSACng
。您应该更喜欢加密下一代(
Cng
)实现,而不是
CryptoServiceProvider
实现

如果您的目标是.NET Framework 4.6或更高版本,或.NET Core 1.0或更高版本,您可以这样使用它:

using Sytem.Security.Cryptography;

Byte[] inputPlaintext = ...
RSAEncryptionPadding oaepsha256 = RSAEncryptionPadding.OaepSHA256;
using( RSA rsaImpl = new RSACng() )
{
    Byte[] ciphertext = rsaImpl.Encrypt( inputPlaintext, oaepsha256 );
}

“在.NET6.0中”-没有.NET6.0。请澄清您的目标平台。KeyExchangeAlgorithm属性没有实际意义,您应该忽略它。但是你需要使用RSACng,而不是rsaccryptoserviceprovider。很抱歉,它的.NET 4.6Thanks RSACng是有效的。在我的场景中,我使用containerkey在机器中存储私钥,在需要时使用RSACryptoServiceProvider使用containerkey名称检索私钥。作为使用RSACng的一种解决方法,我正在导入从rsaccryptoserviceprovider对象导出的属性,这听起来不错。有更好的办法吗?谢谢@Dai RSACng。对更新中提供的解决方法有何评论