使用本机Java JCE验证BouncyCastle在PC上生成的签名

时间:2011-12-05 21:21:33

标签: java digital-signature bouncycastle

我正在使用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验证sig的服务器。在服务器端,使用本机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)发送到pc /服务器的格式,然后可以对其进行验证使用本机JCE方法的服务器显示在第二段代码中?

到目前为止,我已经尝试从r,s数组创建DERObjects(分别作为一个数组一起编码),但仍然没有运气。以前有人面对这个吗?你是怎么解决它的?

1 个答案:

答案 0 :(得分:0)

根据加密消息语法算法RFC 3370),DSA签名编码是一个包含整数rs的ASN.1序列:

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