此代码与反垃圾邮件工作中使用的DKIM签名验证有关。
我有一个来自 ASN.1 编码s1024._domainkey.yahoo.com
byte[]
,但我不知道仅此一项是否包含足够的信息来实现公钥。
基于此类,我似乎可以将 ASN.1 密钥转换为 X509Certificate 公钥,但我需要提供 OID 和一些 ASN.1 编码的参数。
在此示例中,我有 ASN1 密钥的元数据:
- RSA 编码的密钥(ASN.1 DER编码的[ITU-X660-1997] RSAPublicKey per RFC3447)
- 与 sha1 sha256 哈希算法一起使用
- 使用与RFC3447第 A.2 节中的下表相关的 OID(尽管我不知道如何将此信息转换为完整的 OID)
/*
* 1.2.840.113549.1
*
MD2 md2WithRSAEncryption ::= {pkcs-1 2}
MD5 md5WithRSAEncryption ::= {pkcs-1 4}
SHA-1 sha1WithRSAEncryption ::= {pkcs-1 5}
SHA-256 sha256WithRSAEncryption ::= {pkcs-1 11}
SHA-384 sha384WithRSAEncryption ::= {pkcs-1 12}
SHA-512 sha512WithRSAEncryption ::= {pkcs-1 13}
*/
代码示例
string pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrEee0Ri4Juz+QfiWYui/E9UGSXau/2P8LjnTD8V4Unn+2FAZVGE3kL23bzeoULYv4PeleB3gfmJiDJOKU3Ns5L4KJAUUHjFwDebt0NP+sBK0VKeTATL2Yr/S3bT/xhy+1xtj4RkdV7fVxTn56Lb4udUnwuxK4V5b5PdOKj/+XcwIDAQAB";
byte[] pubkeyByteArray = Convert.FromBase64String(pubkey);
AsnEncodedData aData = new AsnEncodedData(pubkeyByteArray);
// OID must not be null, but it is here. What is it?
System.Security.Cryptography.X509Certificates.PublicKey pubKeyRdr = new System.Security.Cryptography.X509Certificates.PublicKey(aData.Oid, null, aData);
问题
- 我应该使用什么 OID?
- ASN.1 参数的示例有哪些?
更新
这是您在使用提供的链接解析数据时提供的数据@erickson:
SEQUENCE (2 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.1.1
NULL
BIT STRING (1 elem)
SEQUENCE (2 elem)
INTEGER(1024 bit)
INTEGER 65537
前面的代码引发ASN1 bad tag value met.
异常的原因是aData
包含不正确的数据(包含上述所有数据)。从我所看到的,这就是System.Security.Cryptography.X509Certificates.PublicKey
的 3 个论点是如何分解的。
- 第一个参数是 OID,即上面的对象标识符。
- 第二个参数是公钥参数。在上面的解析中,您可以看到它是 NULL。
- 第三个参数是实际的公钥值。这是由上面的第三个序列组成的。该序列有 2 个整数,一个 1024 位模数,后跟公共指数。
我使用以下代码对其进行了测试。我找不到在不编写 DER 解析器的情况下解析数据的内置方法。
Oid oid = new Oid("1.2.840.113549.1.1.1");
AsnEncodedData keyValue = new AsnEncodedData(getBytes("30818902818100EB11E7B4462E09BB3F907E2598BA2FC4F541925DABBFD8FF0B8E74C3F15E149E7FB6140655184DE42F6DDBCDEA142D8BF83DE95E07781F98988324E294DCDB392F82890145078C5C0379BB7434FFAC04AD1529E4C04CBD98AFF4B76D3FF1872FB5C6D8F8464755EDF5714E7E7A2DBE2E7549F0BB12B85796F93DD38A8FFF97730203010001"));
AsnEncodedData keyParam = new AsnEncodedData(new byte[] {05, 00});
PublicKey pubKeyRdr = new System.Security.Cryptography.X509Certificates.PublicKey(oid, keyParam, keyValue);
System.Diagnostics.Debug.WriteLine(pubKeyRdr.Key.KeyExchangeAlgorithm);
System.Diagnostics.Debug.WriteLine(pubKeyRdr.Key.KeySize);
它输出RSA-PKCS1-KeyEx
和1024
。
你有一个 SubjectPublicKeyInfo 结构。它看起来像这样:
Sequence {
Sequence {
Oid: 1.2.840.113549.1.1.1
Parameters: null
}
KeyValue: blah blah
}
RSA 密钥的 oid 是 1.2.840.113549.1.1.1。
对于 RSA 密钥,没有参数,因此此参数为 null。
但是,我没有看到AsnEncodedData
上有任何 API 来解析元素并获得您需要的内容。