将ASN.1数据转换为公钥需要什么? 例如,我如何确定OID?

此代码与反垃圾邮件工作中使用的DKIM签名validation有关 。

我有来自s1024._domainkey.yahoo.combyte[] ,它是ASN.1编码的,但我不知道是否仅包含足够的信息来实现公钥。

基于此类 ,我似乎可以将ASN.1密钥转换为X509Certificate公钥,但我需要提供OID和一些ASN.1编码的参数。

在这个例子中,我有ASN1密钥的元数据:

  1. RSA编码密钥(根据RFC3447,ASN.1 DER编码[ITU-X660-1997] RSAPublicKey)
  2. 与sha1 sha256哈希算法一起使用
  3. 使用与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.的原因得到ASN1 bad tag value met. exception是因为aData包含不正确的数据(包含上面的所有数据)。 从我所看到的,是如何分解System.Security.Cryptography.X509Certificates.PublicKey的3个参数。

  1. 第一个参数是OID,它是上面的OBJECT IDENTIFIER
  2. 第二个参数是公钥参数。 在上面的解析中,您可以看到它是NULL。
  3. 第三个参数是实际的公钥值。 这由上面的第三个序列组成。 序列有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-KeyEx1024

你有一个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来解析元素并得到你需要的东西。