Veryfing подпись, сгенерированная BouncyCastle на ПК с использованием нативной Java JCE - PullRequest
1 голос
/ 06 декабря 2011

Я использую BouncyCastle для генерации подписи DSA, но использую собственный JCE для его проверки.

ПРИМЕЧАНИЕ: Я работаю с клиентом j2me, который изначально не поддерживает подпись, поэтому необходима BouncyCastle)

Итак, на клиенте подпись генерируется следующим образом:

DSASigner sig = new DSASigner();
sig.init(true, privateKey);
String plaintext = "This is the message being signed";
BigInteger[] sigArray = sig.generateSignature(plaintext.getBytes());
...

sigArray содержит 2 BigIntegers р и с.

Эта подпись затем должна быть передана на сервер, который использует собственный JCE для проверки подписи. На стороне сервера, используя нативную Java JCE, должна быть возможность проверить подпись следующим образом:

...
Signature sig = Signature.getInstance("SHA1withDSA");
byte[] sigbytes = Base64.decode(signature);
sig.initVerify(publicKey);
sig.update(plaintext.getBytes());
sig.verify(sigbytes)

Проблема заключается в следующем: как мне кодировать sigArray в формат, который можно отправить на ПК / сервер в виде одной строки Base64 (а не отдельно как r и s), которую затем можно проверить на сервере используя собственный метод JCE, показанный во втором фрагменте кода?

До сих пор я пытался создать объекты DERObjects из массивов r, s (отдельно, вместе, как один массив, закодированный), но все же не повезло. Кто-нибудь сталкивался с этим раньше? Как ты справился с этим?

1 Ответ

0 голосов
/ 21 декабря 2011

Согласно Алгоритмам синтаксиса криптографических сообщений ( RFC 3370 ) кодировка подписи DSA представляет собой последовательность ASN.1, содержащую оба целых числа r и s:

Dss-Sig-Value ::= SEQUENCE {
  r INTEGER,
  s INTEGER }
...