Подпись Verifing, созданная BouncyCastle на ПК с использованием собственного Java JCE

Я использую 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 r и s.

Затем эта подпись должна быть передана на сервер, который использует собственный 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 (отдельно, вместе как один массив, закодированный), но все равно не повезло. Кто-нибудь сталкивался с этим раньше? Как вы с этим справились?


person domino    schedule 05.12.2011    source источник


Ответы (1)


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

Dss-Sig-Value ::= SEQUENCE {
  r INTEGER,
  s INTEGER }
person Jcs    schedule 21.12.2011