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