Понимание выходной сигнатуры BCryptSignHash

Я подписал хеш-значение в Windows, используя BCryptSignHash с алгоритмом ECDSA. Буфер выходной сигнатуры имеет длину 64 байта. Я также сгенерировал большие двоичные объекты с открытым и закрытым ключами, используя функцию BCryptGenerateKeyPair (алгоритм BCRYPT_ECDSA_P256_ALGORITHM), с помощью которой я подписал хэш.

Я должен проверить эту подпись с помощью этой пары ключей в Linux. Я могу расшифровать сгенерированную пару открытого и закрытого ключей, используя ссылку "http://msdn.microsoft.com/en-us/library/windows/desktop/aa375520%28v=vs.85%29.aspx" и может использовать то же самое в linux.

Сгенерированная 64-байтовая подпись в идеале должна быть парой подписей (r, s) (http://en.wikipedia.org/wiki/Elliptic_Curve_DSA).

Есть ли способ понять сгенерированную 64-байтовую подпись, чтобы я мог сопоставить содержимое большого двоичного объекта подписи с парой (r, s) в Linux и проверить ее?

Или есть более простой способ проверить сгенерированную подпись в Linux?

Спасибо, F


person Fazlin    schedule 08.01.2014    source источник


Ответы (1)


Есть ли способ понять сгенерированную 64-байтовую подпись, чтобы я мог сопоставить содержимое большого двоичного объекта подписи с парой (r, s) в Linux и проверить ее?

r и s находятся в формате P1363, который представляет собой просто конкатенацию r и s в формате дополнения 2. То есть подпись просто r || s.

Вам нужно знать хеш, чтобы использовать этот формат. Например, SHA1 создаст r из 20 байтов и s из 20 байтов. Если r или s "слишком короткий", он дополняется слева нулями.

Java и OpenPGP отличаются от P1363. Java и OpenPGP используют кодировку ASN.1:

SEQUENCE ::= {
  r INTEGER,
  s INTEGER
}

В зависимости от того, какую библиотеку вы используете в Linux, вам может потребоваться преобразование между форматами. Криптографическое взаимодействие: цифровые подписи дает примеры подписания и проверки с использованием несколько разных библиотек.


Или есть более простой способ проверить сгенерированную подпись в Linux?

Попробуйте Crypto ++. Я считаю, что Microsoft и Crypto ++ используют один и тот же формат подписи, поэтому вам не нужно конвертировать. Подробнее см. алгоритм цифровой подписи с эллиптической кривой.

person jww    schedule 10.01.2014
comment
Спасибо за информацию. Я попробовал crypto ++, и я смог использовать подпись и ключи как на уровне Windows, так и на уровне приложений Linux. Но теперь у меня возникла другая проблема ... | Подпись выполняется на уровне приложений Windows. Проверка должна выполняться в двух местах - в приложении Linux и в драйвере Windows. Crypto ++ был полезен при создании ключей на уровне приложений Windows, и с его помощью я подписал данные. Используя тот же ключ, я смог проверить данные в приложении Linux. Теперь у меня проблема в том, что я не могу использовать крипто ++ в драйверах Windows. Есть ли общая библиотека для трех форматов? - person Fazlin; 04.02.2014