.NET Framework 3.5框架如何使用RSA加密

在.NET Framework 3.5中,没有内置的方法直接解析PKCS#8格式的RSA私钥。但是,你可以使用第三方库如BouncyCastle来解析PKCS#8格式的私钥。以下是使用BouncyCastle库解析PKCS#8格式RSA私钥的示例代码:

首先,你需要安装BouncyCastle库。如果你使用NuGet,可以通过以下命令安装:
Install-Package BouncyCastle -Version 1.8.9

原理就是需要将第三方提供的RSA PKCS8私钥进行解码,然后返回实体类后,再将需要加密的报文信息携带私钥对象进行加密实现,代码如下

using System;
using System.Security.Cryptography;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Parameters;
 
public class RsaPrivateKeyParser
{
    public static RSAParameters ParsePkcs8PrivateKey(string privateKey)
        {
            var privateKeyBytes = Convert.FromBase64String(privateKey);
            var parser = new Asn1InputStream(privateKeyBytes);
            var asn1 = parser.ReadObject();
            var privateKeyInfo = PrivateKeyInfo.GetInstance(asn1);
            //var algorithm = privateKeyInfo.PrivateKeyAlgorithm.AlgorithmID.Id;
            //if (algorithm != Org.BouncyCastle.Asn1.Pkcs.PkcsObjectIdentifiers.RsaEncryption.Id)
            //{
            //    throw new InvalidOperationException("Unsupported algorithm");
            //}

            var privateKeyParams = PrivateKeyFactory.CreateKey(privateKeyInfo);
            var rsaPrivateKeyParams = (RsaPrivateCrtKeyParameters)privateKeyParams;

            var rsa = new RSACryptoServiceProvider();
            var rsaParameters = new RSAParameters()
            {
                Modulus = rsaPrivateKeyParams.Modulus.ToByteArrayUnsigned(),
                Exponent = rsaPrivateKeyParams.PublicExponent.ToByteArrayUnsigned(),
                D = rsaPrivateKeyParams.Exponent.ToByteArrayUnsigned(),
                P = rsaPrivateKeyParams.P.ToByteArrayUnsigned(),
                Q = rsaPrivateKeyParams.Q.ToByteArrayUnsigned(),
                DP = rsaPrivateKeyParams.DP.ToByteArrayUnsigned(),
                DQ = rsaPrivateKeyParams.DQ.ToByteArrayUnsigned(),
                InverseQ = rsaPrivateKeyParams.QInv.ToByteArrayUnsigned()
            };

           // rsa.ImportParameters(rsaParameters);
            return rsaParameters;
        }

	//调用 得到加密后的RSA签名值
 	protected static string GetRSASign(string originalData,string privateKey)
        {
            string signatureBase64 = "";
            try
            {
                // 待加密的数据
                string data = originalData;

                // 导入PKCS8格式的私钥
                string privateKeyString = privateKey;
                //var privateKeyBytes = Encoding.UTF8.GetBytes(privateKeyString);
                //var privateKeyObject = DecodePrivateKey(privateKeyBytes);
                //var rsaParameters = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)privateKeyObject);
                var rsaParameters = ParsePkcs8PrivateKey(privateKeyString);
                using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                {
                    rsa.ImportParameters(rsaParameters);

                    // 计算SHA256摘要
                    byte[] dataBytes = Encoding.UTF8.GetBytes(data);
                    using (SHA256Managed sha256 = new SHA256Managed())
                    {
                        byte[] hashedData = sha256.ComputeHash(dataBytes);

                        // 使用RSA私钥进行签名
                        byte[] signature = rsa.SignHash(hashedData, "SHA256");

                        // Base64编码签名结果
                        signatureBase64 = Convert.ToBase64String(signature);
                    }
                }
                return signatureBase64;
            }
            catch (CryptographicException e)
            {

                return $"CryptographicException: {e.Message}";
            }
        }
}

相关推荐

  1. .NET Framework 3.5框架如何使用RSA加密

    2024-04-02 05:26:04       36 阅读
  2. Oracle如何实现rsa加密和例子

    2024-04-02 05:26:04       26 阅读
  3. RSA非对称加密

    2024-04-02 05:26:04       45 阅读
  4. RSA加密解密】

    2024-04-02 05:26:04       22 阅读
  5. rsa加密登录解决方案

    2024-04-02 05:26:04       42 阅读
  6. .NET RSA加密算法实现

    2024-04-02 05:26:04       37 阅读
  7. 加密算法:RSA非对称加密算法

    2024-04-02 05:26:04       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 05:26:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 05:26:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 05:26:04       58 阅读
  4. Python语言-面向对象

    2024-04-02 05:26:04       69 阅读

热门阅读

  1. 洛伦兹系统ODE方程-MATLAB

    2024-04-02 05:26:04       27 阅读
  2. 软件测试-第四章课后作业

    2024-04-02 05:26:04       39 阅读
  3. 在保存原容器的情况下重新安装docker

    2024-04-02 05:26:04       37 阅读
  4. http协议中的“队头阻塞”问题

    2024-04-02 05:26:04       34 阅读
  5. 在CentOS 7上如何添加交换空间

    2024-04-02 05:26:04       35 阅读
  6. 告别PCA,开始玩高阶的PLS-DA

    2024-04-02 05:26:04       35 阅读
  7. 如何在Bash中连接字符串变量

    2024-04-02 05:26:04       29 阅读
  8. 「PHP系列」数组详解

    2024-04-02 05:26:04       33 阅读
  9. C#WPF自定义控件-继承Button的圆角按钮

    2024-04-02 05:26:04       27 阅读
  10. pytorch剪枝

    2024-04-02 05:26:04       37 阅读
  11. 影视站点为何需要多IP服务器

    2024-04-02 05:26:04       31 阅读