Как рассчитать ASN.1 DER кодирование конкретного алгоритма хеширования?

Учитывая алгоритм хеширования, такой как SHA1 или SHA256, как мне получить кодирование DER ASN.1 для него, как определено в RFC3447? (см. стр. 42 - ссылка) Ниже приведен желаемый результат.

MD5        30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04 10
SHA-1      30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14
SHA-256    30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20
SHA-384    30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00 04 30
SHA-512    30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 04 40

Я надеюсь, что есть какой-то разумный способ сделать это в C#, который не требует от меня написания подпрограммы преобразования Oid в ASN.1 DER (или их жесткого кодирования). Есть идеи?

1 ответ

Решение

Это поможет вам в этом:

string oidString = CryptoConfig.MapNameToOID(hashName); // f.x. "MD5"
byte[] encodedOid = CryptoConfig.EncodeOID(oidString); // Gives you f.x. 06 08 2a 86 48 86 f7 0d 02 05

Тогда вам просто нужно вставить его в заголовок SEQUENCE (30<length>30<length2><oid>050004<hashlength>).

Конечно, если вы хотите создать подпись RSA PKCS#1 v1.5, вам лучше использовать RSAPKCS1SignatureFormatter,


РЕДАКТИРОВАТЬ: Еще несколько деталей:

ASN.1, который вы хотите кодировать, таков:

DigestInfo ::= SEQUENCE {
      digestAlgorithm AlgorithmIdentifier,
      digest OCTET STRING
}

где

AlgorithmIdentifier  ::=  SEQUENCE  {
      algorithm               OBJECT IDENTIFIER,
      parameters              ANY DEFINED BY algorithm OPTIONAL  
}

Итак, для начала изнутри: digest-AlgorithmIdentifier состоит изSEQUENCE-tag (30), длина (мы вернемся к этому), OID и некоторые параметры. OID для fx SHA-1 - это 1.3.14.3.2.26, который кодируется как06 05 2b 0e 03 02 1a(OID-тег 06, длина 5 и кодировка OID). Все обычные хеш-функции имеют NULL в качестве параметров, которые кодируются как 05 00, Итак, AlgorithmIdentifier содержит 9 байтов - это выше.

Теперь мы можем продолжить с остальной частью DigestInfo: OCTET STRING, которая содержит значение хеша. 20-байтовый хэш SHA-1 будет закодирован как04 20 <HASH>,

Длина содержимого DigestInfo теперь составляет 11+22 байта (). Нам нужно запустить DigestInfo сSEQUENCE-Tag, поэтому мы в конечном итоге с:30 21 30 09 06 05 2b 0w 02 01 1a 05 00 04 20 <HASH>,

Если вам нужно сгенерировать его самостоятельно, теперь вы сможете увидеть, что length2 = encodedOid.Length + 2 и эта длина = length2 + 2 + 2 + hashlength.

Если вам нужна дополнительная информация о кодировке ASN.1, я могу порекомендовать "Руководство непрофессионала" Берта Калиски по подмножеству ASN.1, BER и DER.

Другие вопросы по тегам