Как рассчитать ASN.1 DER-кодирование конкретного алгоритма хеширования? - PullRequest
8 голосов
/ 15 сентября 2010

Учитывая алгоритм хеширования, такой как SHA1 или SHA256, как мне получить кодировку ASN.1 DER для него, как определено в 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 Ответ

16 голосов
/ 15 сентября 2010

Это даст вам часть пути:

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, которая содержит значение хеша.20-байтовый хэш SHA-1 будет закодирован как 04 20 <HASH>.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...