我使用 BouncyCaSTLe 生成 DSA 签名,但使用 native 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。
此签名必须传输到使用 native JCE 的服务器来验证签名。在服务器端,使用 native 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/服务器的格式,然后可以使用第二个代码片段中显示的 native JCE 方法在服务器上进行验证?
到目前为止,我已经尝试从 r,s 数组创建 DERObjects(单独地,一起作为一个数组,进行编码),但仍然没有成功。以前有人遇到过这个吗?你是如何解决的?
最佳答案
根据加密消息语法算法 ( RFC 3370 ),DSA 签名编码是包含整数 r
和 s
的 ASN.1 序列>:
Dss-Sig-Value ::= SEQUENCE {
r INTEGER,
s INTEGER }
关于java - 使用 native Java JCE 验证 PC 上 Bouncy CaSTLe 生成的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392041/