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

标签 c# .net 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);
}

在过去的几天里,我看到了很多关于如何使用 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/

相关文章:

c# - C# Linq 扩展方法如何执行相等比较?

c# - 在我的项目中查找所有未使用的代码 (Rider/VSCode)

c# - Xamarin Amazon S3 上传

c# - 查询 dns 别名

c++ - 我们得出 XOR 字符串加密不如众所周知的加密安全的结论是否公平(比如 Blowfish)

c# - 解密文件时出现异常 "Key not valid for use in specified state"

.net - 将超链接设置为 RichTextBox

ios - CCCrypto解密: exactly one block less

java - JAVA中带负号的RSA结果

c# - 构建一个 JsonConstructor 以便能够反序列化我的对象