我正在使用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(分别作为一个数组一起编码),但仍然没有运气。以前有人面对这个吗?你是怎么解决它的?
答案 0 :(得分:0)
根据加密消息语法算法(RFC 3370),DSA签名编码是一个包含整数r
和s
的ASN.1序列:
Dss-Sig-Value ::= SEQUENCE {
r INTEGER,
s INTEGER }