首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将ASN.1数据转换为公钥需要什么?我如何确定OID?

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

Stack Overflow用户
提问于 2012-06-29 21:16:38
回答 2查看 7.2K关注 0票数 4

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

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

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

在本例中,我有一个元数据,ASN1键是:

  1. RSA编码密钥(ASN.1 DER编码ITU-X660-1997 RSAPublicKey / RFC3447)
  2. 与sha1 sha256散列算法一起使用
  3. 使用与RFC3447 A.2节中的下表相关的OID (尽管我不知道如何将这些信息转换为完整的OID)
代码语言:javascript
运行
复制
/*
 * 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}
 */

码样例

代码语言:javascript
运行
复制
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参数的例子是什么?
EN

回答 2

Stack Overflow用户

发布于 2012-06-29 23:43:41

更新

这是使用链接 @erickson提供的解析数据时提供的数据:

代码语言:javascript
运行
复制
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个参数是如何分解的。

  1. 第一个参数是OID,它是上面的对象标识符。
  2. 第二个参数是公钥参数。在上面的解析中,您可以看到它是空的。
  3. 第三个参数是实际的公钥值。这是由上面第三个序列组成的。序列有两个整数,一个1024位模数,后面跟着公共指数.

我使用下面的代码测试了它。我找不到一个内置的方法来解析数据,而不编写一个DER解析器。

代码语言:javascript
运行
复制
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

票数 6
EN

Stack Overflow用户

发布于 2012-06-29 22:58:49

您所拥有的是一个SubjectPublicKeyInfo结构。看起来是这样的:

代码语言:javascript
运行
复制
Sequence {
  Sequence {
    Oid: 1.2.840.113549.1.1.1
    Parameters: null
  }
  KeyValue: blah blah
}

RSA密钥的is为1.2.840.113549.1.1.1。

对于RSA密钥,没有参数,因此这是空的。

但是,我没有看到AsnEncodedData上有任何API来解析元素并得到所需的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11269079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档