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

Che*_*her 5 .net c# encryption cryptography rsa

我正在尝试编写一个函数,它接收一个要编码的字符串,一个公钥作为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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

----- BEGIN PUBLIC KEY ----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6 + H0qtjTkVxwTCpvKe4eCZ0 FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3J + skZ6UtW + 5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB

----- END PUBLIC KEY -----

谢谢!!

Tim*_*nem 6

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

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

你必须去掉"----- BEGIN PUBLIC KEY -----"从和"----- END PUBLIC KEY -----" stringPublicKey,然后再继续.

Asn1Object obj = Asn1Object.FromByteArray(Convert.FromBase64String(stringPublicKey));
Run Code Online (Sandbox Code Playgroud)

然后,按照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];
Run Code Online (Sandbox Code Playgroud)

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

RsaKeyParameters keyParameters = new RsaKeyParameters(false, modulus.PositiveValue, exponent.PositiveValue);
Run Code Online (Sandbox Code Playgroud)

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

RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters);
Run Code Online (Sandbox Code Playgroud)

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

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(parameters);
Run Code Online (Sandbox Code Playgroud)

最后,进行加密:

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