【发布时间】:2020-03-15 09:04:24
【问题描述】:
我正在尝试使用 Oid 和 RSA 公钥创建一个 PublicKey 实例,但我得到一个 CryptographyException 并显示“ASN1 bad tag value met”。我正在按照here 找到的答案最终创建一个 RSACryptoServiceProvider。
这是我的代码:
string pem = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkxqnUqh5WYis/Q+sQc5h
O9i5aX7XvVEVdrhrnFcbwSb1/GyQWPvn1ZydQB88zW9CnNFq08QRg+IYaBYdqs12
EbxkET20eWY7xvI8kBICPxOdYAHBb0JWpdK4GjSCSxCFrJIXXmHtnRqj6PmSoPrb
uFdC5MTFXfFwphgZi+Ae5MM2nxDu0P/UT8W1VMNVYRkC0dldo+csK1p9NLKga64z
MiNop9nM3meSHpOt+P65l1B+e5EeXM+qzrIeJH4ul95HJdKkPypDM18y4FkFA73S
r6vHYQvQjmBiGy0op1Qs7t+8UkpOX41j28IeiE2yyG7S6/k8Qcu0yv1uaFn3a9VJ
jwIDAQAB
-----END PUBLIC KEY-----";
var rsaPublicKeyStr = pem.Replace(
"-----BEGIN PUBLIC KEY-----\r\n", "").Replace("\r\n-----END PUBLIC KEY-----", "");
var rsaPublicKey = Convert.FromBase64String(rsaPublicKeyStr);
Oid oid = new Oid("RSA");
AsnEncodedData keyValue = new AsnEncodedData(rsaPublicKey);
AsnEncodedData keyParam = new AsnEncodedData(new byte[] { 05, 00 }); // ASN.1 code for NULL
PublicKey pubKeyRdr = new PublicKey(oid, keyParam, keyValue);
try
{
var rsa = (RSACryptoServiceProvider)pubKeyRdr.Key;
}
catch (CryptographicException ce)
{
Console.WriteLine(ce);
}
还有输出:
System.Security.Cryptography.CryptographicException: ASN1 bad tag value met.
at System.Security.Cryptography.X509Certificates.PublicKey.DecodePublicKeyObject(UInt32 aiPubKey, Byte[] encodedKeyValue, Byte[] encodedParameters, Byte[]& decodedData)
at System.Security.Cryptography.X509Certificates.PublicKey.get_CspBlobData()
at System.Security.Cryptography.X509Certificates.PublicKey.get_Key()
at License.Crypto.doCryptoStuff()
【问题讨论】:
-
您需要从原始数据中提取模数和公共指数。您的编码值包括带有对象标识符的完整公钥。这部分应该从编码值中剥离,以便传递给
PublicKey类的构造函数。 -
@Crypt32:我什至不知道 .NET 有 ASN.1 类。我看了看,他们似乎没有任何有用的解析方法。
-
没有可用于 ASN.1 的内置类。您必须使用 3rd 方库来解析 ASN 数据。
标签: c# rsa pem asn.1 rsacryptoserviceprovider