C# 覆盖RSA对象中的默认算法以支持OaepSHA256填充
在.Net 4.6中创建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
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。对更新中提供的解决方法有何评论