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

goo*_*ate 4 c# cryptography asn.1 dkim x509certificate

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

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

基于这个类,看来我可以转换的ASN.1钥匙插入X509证书公钥,但我需要提供一个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}
 */
Run Code Online (Sandbox Code Playgroud)

代码示例

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);
Run Code Online (Sandbox Code Playgroud)

  • 我应该使用什么OID?
  • 什么是ASN.1参数的例子?

use*_*279 6

更新

这是使用@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
Run Code Online (Sandbox Code Playgroud)

之前的代码抛出ASN1 bad tag value met.异常的原因是因为aData包含不正确的数据(包含上面的所有数据).从我所看到的,这三个论点是如何System.Security.Cryptography.X509Certificates.PublicKey被分解的.

  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);
Run Code Online (Sandbox Code Playgroud)

它输出RSA-PKCS1-KeyEx1024.

  • 05,00是"NULL"的ASN.1编码. (2认同)