我正在尝试编写一个函数,它接收一个要编码的字符串和一个公钥作为 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 算法加密的问题和答案,但是没有找到关于如何在我已经拥有现有 key (特别是在 PKCS 中)时创建 RSACryptoServiceProvider 的信息# 1 格式), 只有如何生成 key 对。
例如:给定以下字符串,我将如何使用 RSA 加密来加密数据?
-----开始公钥----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0 FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/ 3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----结束公钥-----
谢谢!!
最佳答案
您可以使用 BouncyCastle ,一个 .NET 库,允许您将 PKCS#1 格式的 key 转换为可用于加密和解密的实际 key 参数。
因为您拥有的公钥被格式化为 PKCS#1 base64 编码值。然后您可以使用 BouncyCaSTLe 将公钥解码为 ASN.1 对象,如下所示
您必须在之前从 stringPublicKey
中删除 '-----BEGIN PUBLIC KEY-----' 和 '-----END PUBLIC KEY-----'你继续。
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);
关于C# RSA 使用给定的 PKCS#1 公钥加密文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37413837/