【问题标题】:how to import public key into RSA for encrypt in .net core如何将公钥导入 RSA 以在 .net 核心中加密
【发布时间】:2018-01-05 03:59:01
【问题描述】:
我有 publicKey.key,我想将它导入 rsa 加密
这是我的代码:
using (RSA rsa = RSA.Create())
{
var key = Encoding.UTF8.GetBytes("012345678901234567890");
byte[] publicKey = File.ReadAllBytes("text/publicKey.key");
var result = rsa.Encrypt(key, RSAEncryptionPadding.Pkcs1);
}
【问题讨论】:
标签:
.net-core
rsa
public-key-encryption
asp.net-core-webapi
asp.net-core-1.1
【解决方案1】:
编辑: 2021-11-29 - 更新已过期两年的答案,包括 .NET Core 3.0 API
.NET Core 3.0+ 可以通过特定于格式的方法加载 BER 编码的密钥文件格式(不是文本/PEM 格式):
- AsymmetricAlgorithm.ImportSubjectPublicKeyInfo
- 非对称算法.ImportPkcs8PrivateKey
- AsymmetricAlgorithm.ImportEncryptedPkcs8PrivateKey
- RSA.ImportRSAPublicKey
- RSA.ImportRSAPrivateKey
- ECDsa.ImportECPrivateKey
- 等
.NET 5+ 还可以通过通用调度程序加载 PEM 格式密钥(因为 PEM 标签标识格式):
- 非对称算法.ImportFromPem
- 非对称算法.ImportFromEncryptedPem
.NET Framework 和 .NET Core 的旧版本(在最初回答时就已经存在,现在都不再支持)都没有内置的方式来加载裸密钥文件。
对于这些环境,您有几个选择:
- 将公钥包装成证书并使用
cert.GetRSAPublicKey()
- 使用
openssl rsa -in text/publicKey.key -text -noout复制每个字段的所有十六进制值,并将它们直接导入RSAParameters结构(然后调用(rsa.ImportParameters(rsaParams))
- 学习ITU-T X.680(ASN.1)、ITU-T X.690(DER)、PKCS#1(RSA)和RFC 7486(如果要读取PEM编码的密钥)读取密钥文件,然后解析将其转换为
RSAParameters 结构,并使用rsa.ImportParameters(rsaParams)。
值得注意的是,这已被确定为 .NET 中的一个缺口,并且当前标记为 .NET Core 2.1(尽管它总是可能无法实现):https://github.com/dotnet/corefx/issues/20414。 (编辑:它没有用于 2.1,它用于 3.0)
【解决方案2】:
试试ImportRSAPublicKey/ImportRSAPrivateKey
您的代码应如下所示
...
using( RSA rsa = RSA.Create())
{
var publicKeyBytes = Convert.FromBase64String(yourPublicKey);
rsa.ImportRSAPublicKey(publicKeyBytes,bytesRead:out int _);
var encryptedResult = rsa.Encrypt(yourData, RsaEncryptionPadding.Pkcs1);
}
...