2012-06-29 3 views
2

Этот код относится к DKIM signature verification, используемому в усилиях по борьбе со спамом.Что необходимо для преобразования данных ASN.1 в открытый ключ? например как определить OID?

У меня есть byte[] от s1024._domainkey.yahoo.com, который закодирован в ASN.1, но я не знаю, содержит ли это только достаточно информации для создания открытого ключа.

На основании this class, похоже, я могу преобразовать ключ ASN.1 в открытый ключ X509Certificate, но мне нужно указать OID и некоторые ASN.1-кодированные параметры.

В этом примере есть метаданные, что ключ является ASN1:

  1. ПДС кодируется ключом (ASN.1 DER-закодированные [МСЭ-X660-1997] RSAPublicKey в RFC3447)
  2. Используется либо с алгоритмы хеширования sha1 sha256
  3. Использует OID, относящуюся к следующей таблице из раздела А.2 RFC3447 (хотя я не знаю, как превратить эту информацию в полном 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?
+0

Не похоже, что 'AsnEncodedData' фактически анализирует данные. Вам нужно будет установить oid через: aData.Oid = new Oid ("1.2.840.113549.1.1") '. После разбора DER-TLV вы можете использовать [oid tool] (http://www.rtner.de/software/oid.html) для преобразования шестнадцатеричных данных в строковое представление, * UNIVERSAL OID.1.2.840.113549.1.1. 1 *. – user845279

+0

Вот связанный с этим вопрос, который касается только ключа, 'CspParameters' и' RSACryptoServiceProvider': [Загружать ASN.1/DER закодированную пару ключей RSA в C#] (http://stackoverflow.com/q/42175485/608639). Я указываю на это, потому что многие ответы переполнения стека говорят, что вы делаете что-то с сертификатами или используете BouncyCastle, когда все, что вы делаете, пытается загрузить ключ. Также обратите внимание ... точка боли связана с .Net и их использованием кодировки XML из [RFC 3275] (https://www.ietf.org/rfc/rfc3275.txt). .Net не принимает ключи ASN.1/DER или PEM. – jww

ответ

1

У вас есть структура SubjectPublicKeyInfo. Это выглядит следующим образом:

Sequence { 
    Sequence { 
    Oid: 1.2.840.113549.1.1.1 
    Parameters: null 
    } 
    KeyValue: blah blah 
} 

подъязычная для ключей RSA является 1.2.840.113549.1.1.1.

Для ключа RSA нет параметров, поэтому это значение равно null.

Однако, я не вижу никакого API на AsnEncodedData, чтобы разобрать элементы и получить то, что вам нужно.

+0

Как вы это поняли? Из памяти или предыдущего опыта работы? – LamonteCristo

+0

@ makerofthings7 Я вспомнил структуру SubjectPublicKeyInfo из предыдущего опыта работы. Я определил, с чем вы работаете, расшифруя его [здесь.] (Http://lapo.it/asn1js/) – erickson

5

Update

Это данные, которые вы предоставили, когда он обрабатывается с помощью link @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. Первый параметр представляет собой идентификатор объекта, который является идентификатор объекта выше.
  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-KeyEx и 1024.

+0

Как вы это поняли? Что означает 'новый байт [] {05, 00}'? – LamonteCristo

+2

05, 00 - это кодировка ASN.1 «NULL». – erickson

+0

Данные, которые вы предоставили, могут быть проанализированы, чтобы получить данные, которые были хорошо описаны @erickson, чтобы выяснить, что такое oid. Как вы уже упоминали, изначально исходное значение null. Во всяком случае, нулевая часть упоминается в одном из документов rfc. Способ, которым я действительно нашел формат, - это использовать 'X509Certificates.Import()' в существующем файле blah.cer. Я заметил, что ключевым параметром является 0500. Как вы видите, это не является хорошим объяснением для решения, почему я его не опубликовал. – user845279

 Смежные вопросы

  • Нет связанных вопросов^_^