C# RSA 使用给定的 PKCS#1 public 密钥加密文本
C# RSA Encrypting text using a given PKCS#1 public key
我正在尝试编写一个函数来接收一个要编码的字符串和一个 public 密钥作为 PKCS#1 格式的 base64 编码字符串,以及 returns 一个编码字符串。
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 算法加密的问题和答案,但是还没有找到关于如何创建 RSACryptoServiceProvider 的信息,当我已经有了一个现有的密钥(特别是, PKCS#1 格式),只有如何生成密钥对。
例如:给定以下字符串,我将如何使用 RSA 加密来加密数据?
-----开始 PUBLIC 键-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----结束 PUBLIC 关键-----
谢谢!!
您可以使用 BouncyCastle,这是一个 .NET 库,可让您将 PKCS#1 格式的密钥转换为可用于加密和解密的实际密钥参数。
因为您拥有的 public 密钥被格式化为 PKCS#1 base64 编码值。然后您可以使用 BouncyCastle 将 public 密钥解码为 ASN.1 对象,如下所示
你必须去掉'-----BEGIN PUBLIC KEY-----'和'-----END PUBLIC KEY-----' 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];
在这里,您拥有创建 public 密钥所需的一切:
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);
我正在尝试编写一个函数来接收一个要编码的字符串和一个 public 密钥作为 PKCS#1 格式的 base64 编码字符串,以及 returns 一个编码字符串。
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 算法加密的问题和答案,但是还没有找到关于如何创建 RSACryptoServiceProvider 的信息,当我已经有了一个现有的密钥(特别是, PKCS#1 格式),只有如何生成密钥对。
例如:给定以下字符串,我将如何使用 RSA 加密来加密数据?
-----开始 PUBLIC 键----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0 FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/ 3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----结束 PUBLIC 关键-----
谢谢!!
您可以使用 BouncyCastle,这是一个 .NET 库,可让您将 PKCS#1 格式的密钥转换为可用于加密和解密的实际密钥参数。
因为您拥有的 public 密钥被格式化为 PKCS#1 base64 编码值。然后您可以使用 BouncyCastle 将 public 密钥解码为 ASN.1 对象,如下所示
你必须去掉'-----BEGIN PUBLIC KEY-----'和'-----END PUBLIC KEY-----' 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];
在这里,您拥有创建 public 密钥所需的一切:
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);