2015-07-04 3 views
1

Из http://www-archive.mozilla.org/projects/security/pki/nss/tech-notes/tn7.html, он утверждает, чтоPK11_Sign с прокладкой

Для подписи низкого уровня, используйте PK11_Sign(). Обе эти функции делают обертку данных PKCS # 1. PK11_Sign не делает кодирование хэш BER (как это делается в функции SGN_)

Из кода API

/* 
* sign a hash. The algorithm is determined by the key. 
*/ 
SECStatus 
PK11_Sign(SECKEYPrivateKey *key, SECItem *sig, const SECItem *hash) 

Q1) Мои PK11_Sign функции приводит к недопустимой подписи. Входом хэш-данных является a7cd893b31b0ea44ed1aa7cafcda658744cc5a02ef26feccceaae9a8becb83a0 хэш SHA-256, из «Hello SHA-256». Data-> len - 64. Затем код выполняет шестнадцатеричный код в двоичном формате. Затем я передаю эту информацию в PK11_Sign. Я пропустил какие-то шаги?

Q2) Что означает BER кодирование хэша? Если у нас есть строка хэша в hexdecimel, то мы преобразуем ее в двоичный код хэша, то есть BER? Или предложение означает, что оно поддерживает только DER?

Q3) Любой образец PK11_Sign аналогичен операции, как указано выше?

ответ

0

Я не могу ответить Q1, поскольку я не знаком с API NSS, но я думаю, что Q2 довольно легко ответить.

При создании подписи следующей схемы подписи RSASSA-PKCS1-v1_5 определено в PKCS # 1 (RFC3447), необходимо вычислить значение хэш-функции первого и поместить его в DigestInfo структуру:

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

DigestInfo затем должен быть BER закодирован и зашифрован с помощью закрытого ключа. Таким образом, вы не шифруете только сырое хеш-значение, а BER-кодированную структуру DigestInfo, которая содержит сырое хеш-значение вместе с алгоритмом OID хэш-алгоритма.

1

Q1: Да, необходимо добавить значение хэша в кодировку ASN.1/DER OID SHA-256, а также тег и длину самого значения хэш-функции.

Q2: BER - это основные правила кодирования ASN.1, это двоичное кодирование данных длины (TLV) данных, которое структурировано в соответствии с определениями ASN.1. DER - это каноническое подмножество BER. Вы обязательно должны использовать DER здесь.

Q3: Ну, нет, но я думаю, что могу ускорить работу для вас, так как создание или даже изучение ASN.1 отнимает много времени. Поскольку OID (идентификатор хэш-алгоритма) и длина хэша остаются статическими, кодирование DER также является статическим. Таким образом, вы можете просто префикс шестнадцатеричных шестнадцатеричных хэшей по вашему выбору.


RSA PKCS # 1 2,1 (и 2,2) раздел 9.2 примечание 1:

  1. Для указанных в приложении B. шести хэш-функций1, МЭД кодирования T значения DigestInfo равна следующему:
MD2:  (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 02 05 00 04 
       10 || H. 
    MD5:  (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04 
       10 || H. 
    SHA-1: (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H. 
    SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 
       04 20 || H. 
    SHA-384: (0x)30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00 
       04 30 || H. 
    SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 
        04 40 || H. 

Обратите внимание, что если вы все сделаете правильно, то вы должны быть в состоянии рассматривать все непосредственно в двоичном виде в во время выполнения; не должно быть необходимости сначала кодировать вывод хеша в двоичный файл, а затем обратно.

+0

Благодарим за информацию. Наконец, я получил действительную подпись, основываясь на вашем ответе на Q1. –

+0

Рад, что это помогло, не забудьте нажать «принять», если найдете ответы на этот номер (V mark слева). Я замечаю, что до сих пор у вас нет никаких утверждений, что указывает на то, что вы либо не знаете, либо еще не получили полезных/полных ответов. –