C#RSA使用给定的PKCS#1公钥加密文本 [英] C# RSA Encrypting text using a given PKCS#1 public key
问题描述
我正在尝试编写一个函数,以PKCS#1格式接收要编码的字符串和作为base64编码的字符串的公钥,然后返回编码后的字符串。
I am trying to write a function the receives a string to encode and a public key as base64 encoded string in PKCS#1 format, and returns an encoded string.
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的信息,只有如何生成密钥对。
I've seen many questions and answers over past few day about how to encrypt using the RSA algorithm, but haven't found information on how to create a RSACryptoServiceProvider when I already have an existing key (specifically, in a PKCS#1 format), only how to generate a key pair.
例如:给定以下字符串,我该如何使用RSA加密来加密数据?
for example: given the following string, how would I encrypt data using RSA encryption?
----- BEGIN公钥- ---
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6 + H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ / DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1 /
3J + skZ6UtW + 5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0 FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/ 3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
----- END PUBLIC KEY -----
-----END PUBLIC KEY-----
谢谢!
推荐答案
您可以使用 BouncyCastle ,这是一个.NET库,可让您将PKCS#1格式的密钥转换为实际的密钥参数
You can use BouncyCastle, a .NET library that allows you to convert from PKCS#1 formatted key to actual key parameters that can be used to encrypt and decrypt.
由于您拥有的公钥的格式设置为PKCS#1 base64编码的值。然后,您可以使用BouncyCastle将公钥解码为ASN.1对象,如下所示:
Since the public key you have is formatted as PKCS#1 base64-encoded value. Then you can decode the public key as an ASN.1 object using BouncyCastle as the following
您必须删除'----- BEGIN PUBLIC KEY-- -'和'<-END PUBLIC KEY -----'( stringPublicKey
),然后继续。
You have to strip out '-----BEGIN PUBLIC KEY-----' and '-----END PUBLIC KEY-----' from the stringPublicKey
before you continue.
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];
在这里,您拥有创建公钥所需的一切:
Here, you have all you need to create a public key:
RsaKeyParameters keyParameters = new RsaKeyParameters(false, modulus.PositiveValue, exponent.PositiveValue);
然后,BouncyCastle提供了一种简单的方法来将其转换为与.NET兼容的 RSAParameters
:
Then, BouncyCastle provides an easy way to convert this to .NET compatible RSAParameters
:
RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters);
然后您可以轻松地将关键参数导入 RSACryptoServiceProvider
:
You can then easily import the key parameters into RSACryptoServiceProvider
:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(parameters);
最后,进行加密:
byte[] dataToEncrypt = Encoding.UTF8.GetBytes(stringDataToEncrypt);
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, true);
return Convert.ToBase64String(encryptedData);
这篇关于C#RSA使用给定的PKCS#1公钥加密文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!