C# RSA 使用给定的 PKCS#1 公钥加密文本



我正在尝试编写一个函数,该函数接收要编码的字符串和公钥作为PKCS#1格式的base64编码字符串,并返回编码字符串。

    public static string EncryptRsa(string stringPublicKey, string stringDataToEncrypt)
{
    byte[] publicKey = Convert.FromBase64String(stringPublicKey);
    // Code to create an RSACryptoServiceProvider with the public key
    // var rsa = new RSACryptoServiceProvider(??)
    byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt);
    var encryptedData = rsa.Encrypt(dataToEncrypt, true);
    return Convert.ToBase64String(encryptedData);
}

在过去的几天里,我看到了很多关于如何使用 RSA 算法进行加密的问题和答案,但是当我已经有一个现有密钥(特别是 PKCS#1 格式)时,还没有找到有关如何创建 RSACryptoServiceProvider 的信息,只有如何生成密钥对。

例如:给定以下字符串,如何使用 RSA 加密加密数据?

-----开始公钥-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB

-----结束公钥

-----

谢谢!!

您可以使用 BouncyCastle,这是一个 .NET 库,允许您从 PKCS#1 格式的密钥转换为可用于加密和解密的实际密钥参数。

由于您拥有的公钥被格式化为 PKCS#1 base64 编码值。然后,您可以使用BouncyCastle将公钥解码为ASN.1对象,如下所示

继续之前,您必须从stringPublicKey中删除"-----开始公钥-----"和"-----结束公钥-----"。

Asn1Object obj = Asn1Object.FromByteArray(Convert.FromBase64String(stringPublicKey));

然后,如 RFC 3447 (A 1.1) 中所述:

DerSequence publicKeySequence = (DerSequence)obj;
DerBitString encodedPublicKey = (DerBitString)publicKeySequence[1];
DerSequence publicKey = (DerSequence)Asn1Object.FromByteArray(encodedPublicKey.GetBytes());
DerInteger modulus = publicKey[0];
DerInteger exponent = publicKey[1];

在这里,您拥有创建公钥所需的一切:

RsaKeyParameters keyParameters = new RsaKeyParameters(false, modulus.PositiveValue, exponent.PositiveValue);

然后,BouncyCastle提供了一种简单的方法,可以将其转换为.NET兼容RSAParameters

RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters);

然后,您可以轻松地将关键参数导入到RSACryptoServiceProvider

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(parameters);

最后,进行加密:

byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt);
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, true);
return Convert.ToBase64String(encryptedData);

最新更新