什么是需要的ASN.1数据转换为公共密钥? 例如,我怎么决定的OID?(What is need

2019-06-25 22:07发布

该代码涉及DKIM签名验证反垃圾邮件工作使用。

我有一个byte[]s1024._domainkey.yahoo.com即ASN.1编码,但我不知道,如果单独包含足够的信息,以兑现公钥。

基于这个类 ,看来我可以转换的ASN.1钥匙插入X509证书公钥,但我需要提供一个OID和一些ASN.1编码参数。

在这个例子中,我有一个在ASN1关键是元数据:

  1. 一个RSA编码的密钥(ASN.1 DER编码[ITU-X660-1997]每RFC3447 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参数的例子吗?

Answer 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包含不正确的数据(包含上文中的数据)。 从我所看到的,将是怎样的3个参数System.Security.Cryptography.X509Certificates.PublicKey被分解。

  1. 第一个参数是所述OID,这是上面的对象标识符
  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



Answer 2:

你有什么是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密钥,没有参数,所以这是空。

不过,我没有看到任何API AsnEncodedData解析分开的元素,并在你需要得到什么。



文章来源: What is needed to convert ASN.1 data to a Public Key? e.g. how do I determine the OID?