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