Цифровая подпись Adobe PDF непонятки

Тема в разделе "WASM.CRYPTO", создана пользователем vxloader, 13 янв 2012.

  1. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    Взял подписанный pdf, расшифровал подпись на выходе:
    0x1 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x0 0x30 0x21 0x30 0x9 0x6 0x5 0x2b 0xe 0x3 0x2 0x1a 0x5 0x0 0x4 0x14 0x1 0x8c 0x84 0xe6 0x43 0x7 0x9b 0x83 0xa5 0x2c 0xe5 0x80 0x70 0x28 0xfa 0x4a 0xbb 0xf 0x4d 0xbe

    параметры подписи: rsa-1024, sha-1
    sha-1 дает размер 20 байт, а на выходе получилось 36!!! ктонить знает что там еще содержица?

    из доки:
    A byte range digest shall be computed over a range of bytes in the file, that shall be indicated by the ByteRange entry in the signature dictionary. This range should be the entire file, including the signature dictionary but excluding the signature value itself (the Contents entry).
    логично предопложить что это два хэш значения от файла до и после поля Contents, но по длине не подходит
     
  2. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    походу это константная строка: 0x30 0x21 0x30 0x9 0x6 0x5 0x2b 0xe 0x3 0x2 0x1a 0x5 0x0 0x4 0x14 которая участвует в вычислениях
    при расшифровки цифровой подписи плагина: hls.api наблюдаем туже самую картину:
    00 01 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff 00 30 21 30
    09 06 05 2b 0e 03 02 1a 05 00 04 14 86 37 02 af
    0e 43 e7 43 0a 55 a5 34 69 a9 76 1b 08 53 03 80
     
  3. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    взял нормальный сертификат, расшифровал цифровую подпись его (см. первый пост), удалил как полагаеца 80h последних байт и начал вычислять sha1 от полученного, потом удаляя по одному байту с конца, дойдя до открытого ключа, и тоже самое сначала - НИХЕРА! расшифрованный хэш не совпадает с вычисленным!!!
    где же у него кнопка?
     
  4. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    выяснил что это DER кодировка ASN.1
    SEQUENCE(2 elem)
    SEQUENCE(2 elem)
    OBJECT IDENTIFIER1.3.14.3.2.26 (код для SHA1)
    NULL
    OCTET STRING(20 byte) 863702AF0E43E7430A55A53469A9761B08530380 -должно быть хэш значение от сертификата, но оно не совпадает с тем которое я вычисляю

    зы
    так где же у него кнопка....
     
  5. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    ок, выяснил что хэш значение нужно считать тока для структуры: tbsCertificate (rfc3280 п.4.1, rfc5280 4.1)
    Certificate ::= SEQUENCE {
    tbsCertificate TBSCertificate,
    signatureAlgorithm AlgorithmIdentifier,
    signatureValue BIT STRING }

    т.е. на практике считаем хэш значение от кодировки DER ASN.1 нотации серта
    исключаем заголовок самого сертификата - первые 4 байта
    и исключаем концовку ну там от длины зависит
    ну и все типа выходит правильно
     
  6. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    с x.509 разабралсо
    такае же проблема возникла с контейнером PKCS#7
    допустем есть серт PKCS#7 в нем содержица серт X.509 в конце подпись, открытый ключ для проверки этой подписи лежит в серте, от чего хэш считаеца серта PKCS#7 (который в конце)?
    товарищи из криптопры тут есть?
     
  7. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    А в rfc 2315 нет этой инфы разве?
     
  8. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    Прочитал но не особо понял) (опыта не очень)
    У меня серт - Signed-data content type
    В конце сертификата зашифрованный хэш, не могу понять от чего это хэш значение
    Согласно rfc все опробывал - не помогло
    Осталось тока методом последовательного исключения искать тот диапазон в серте, который дает нужный хэш
     
  9. vxloader

    vxloader New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    18
    нашел пример по ссылке http://www.jensign.com/JavaScience/sigview/index.html
    там все нормально, если взять хэш от строки: Mitch Gallant.. и расшифровать хэш в конце, открытым ключем из встроенного сертификата то они совпадут
    т.е.

    Offset| Len |LenByte|
    ======+======+=======+======================================================================
    0| 938| 3| SEQUENCE :
    4| 9| 1| OBJECT IDENTIFIER : signedData [1.2.840.113549.1.7.2]
    15| 923| 3| CONTEXT SPECIFIC (0) :
    19| 919| 3| SEQUENCE :
    23| 1| 1| INTEGER : 1
    26| 11| 1| SET :
    28| 9| 1| SEQUENCE :
    30| 5| 1| OBJECT IDENTIFIER : sha1 [1.3.14.3.2.26]
    37| 0| 1| NULL : ''
    39| 30| 1| SEQUENCE :
    41| 9| 1| OBJECT IDENTIFIER : data [1.2.840.113549.1.7.1]
    52| 17| 1| CONTEXT SPECIFIC (0) :
    54| 15| 1| OCTET STRING :
    | | | 4D697463682047616C6C616E740D0A

    хэш считаеца тока для OCTET STRING по смещению 54 и длиной 15