Это даст вам часть пути:
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 .