C#RSA使用给定的PKCS#1公钥加密文本 [英] C# RSA Encrypting text using a given PKCS#1 public key

查看:144
本文介绍了C#RSA使用给定的PKCS#1公钥加密文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个函数,以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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆