4

このコードは、スパム対策の取り組みで使用されるDKIM署名の検証に関連しています。

私はASN.1でエンコードされたbyte[]からを持ってs1024._domainkey.yahoo.comいますが、それだけで公開鍵を具体化するのに十分な情報が含まれているかどうかはわかりません。

このクラスに基づいて、ASN.1キーをX509Certificate公開キーに変換できるようですが、OIDといくつかのASN.1でエンコードされたパラメーターを指定する必要があります。

この例では、ASN1キーが次のメタデータを持っています。

  1. RSAエンコードキー(ASN.1DERエンコード[ITU-X660-1997]RFC3447に準拠したRSAPublicKey)
  2. いずれかのsha1sha256ハッシュアルゴリズムで使用
  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パラメーターの例は何ですか?
4

2 に答える 2

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

前のコードがASN1 bad tag value met.例外をスローする理由は、aData正しくないデータが含まれている (上記のすべてのデータが含まれている) ためです。私が見てきたことから、 への 3 つの引数がどのように分類されるかを示しSystem.Security.Cryptography.X509Certificates.PublicKeyます。

  1. 最初のパラメータは、上記のOBJECT IDENTIFIERである OIDです。
  2. 2 番目のパラメーターは公開鍵パラメーターです。上記の解析では、NULL であることがわかります。
  3. 3 番目のパラメーターは、実際の公開鍵の値です。これは、上記の 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ます。

于 2012-06-29T23:43:41.243 に答える
1

あなたが持っているのは 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 は見当たりません。

于 2012-06-29T22:58:49.330 に答える