在.NET 8中,我使用以下RSA加密代码(简化):
public static string EncryptWithPublicKey(string text, string keyString)
{
var rsa = RSA.Create();
rsa.ImportRSAPublicKey(Convert.FromBase64String(keyString), out _);
var dataBytes = Encoding.UTF8.GetBytes(text);
var encryptedBytes = rsa.Encrypt(dataBytes, RSAEncryptionPadding.OaepSHA256);
return Convert.ToBase64String(encryptedBytes);
}
public static string DecryptWithPrivateKey(string cipherText, string keyString)
{
var rsa = RSA.Create();
rsa.ImportRSAPrivateKey(Convert.FromBase64String(keyString), out _);
var encryptedBytes = Convert.FromBase64String(cipherText);
var decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.OaepSHA256);
return Encoding.UTF8.GetString(decryptedBytes);
}
public static KeyPair GenerateKeyPair()
{
using RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
{
return new KeyPair() { PrivateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey()), PublicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey()) };
}
}
我需要将其移植到 .NET 4.8 项目,但该框架似乎仅支持 SHA1 - 是这样吗?
我尝试使用充气城堡和扩展,如https://gist.github.com/valep27/4a720c25b35fff83fbf872516f847863,这使我能够进行基本的密钥生成,然后使用
RSAEncryptionPadding.OaepSHA1
进行一些加密/解密,但我需要支持SHA256 。有人有这方面的例子吗,因为我有点卡住了!
更新 我在 .net 项目中使用的代码使用上面的链接,如下所示:
public static string EncryptWithPublicKey(string text, string keyString)
{
var rsa = RSAKeys.ImportPublicKey(keyString);
var dataBytes = Encoding.UTF8.GetBytes(text);
var encryptedBytes = rsa.Encrypt(dataBytes, RSAEncryptionPadding.OaepSHA256);
return Convert.ToBase64String(encryptedBytes);
}
public static KeyPair GenerateKeyPair()
{
var rsacp = new RSACryptoServiceProvider();
var privateKey = RSAKeys.ExportPrivateKey(rsacp);
var publicKey = RSAKeys.ExportPublicKey(rsacp);
return new KeyPair() { PrivateKey = privateKey, PublicKey = publicKey };
}
但是当它运行加密方法时,它会说“指定的填充模式对此算法无效。”如果我将填充更改为 SHA1,它就可以工作
使用 RSACng 而不是基于 CAPI 的 RSACryptoServiceProvider。文档可能会警告说
RsaCng
仅适用于 Windows,但 .NET Framework 也适用。正如跨平台加密图表所示,基于 CAPI 的 RSACryptoServiceProvider
是唯一不支持 OaepSHA256
。
var rsa=new RSACng();
为了避免对算法进行硬编码,您可以将算法名称作为参数传递,或通过 app.config 指定。如 RSA.Create 源所示,
Create
返回为 "System.Security.Cryptography.RSA"
配置的任何算法。
本文解释如何配置算法名称以及如何更改
System.Security.Cryptography.RSA
的默认值。您可以在here找到映射文档。您可以尝试将默认值设置为 RSACng
,方法是将其添加到应用程序的配置文件中:
<mscorlib>
<cryptographySettings>
<cryptoNameMapping>
<cryptoClasses>
<cryptoClass
MyRSAImplementation="System.Security.Cryptography.RSACng,
System.Core, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
</cryptoClasses>
<nameEntry
name="SomeCustomFriendlyName"
class="MyRSAImplementation" />
<nameEntry
name="System.Security.Cryptography.RSA"
class="MyRSAImplementation" />
</cryptoNameMapping>
</cryptographySettings>
</mscorlib>