.NET 4.8 中使用 RSAEncryptionPadding.OaepSHA256 进行 RSA 加密

问题描述 投票:0回答:1

在.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,它就可以工作

c# encryption .net-4.8
1个回答
0
投票

使用 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>
© www.soinside.com 2019 - 2024. All rights reserved.