java - 使用 native Java JCE 验证 PC 上 Bouncy CaSTLe 生成的签名

标签 java digital-signature bouncycastle

我使用 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 签名编码是包含整数 rs 的 ASN.1 序列>:

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

关于java - 使用 native Java JCE 验证 PC 上 Bouncy CaSTLe 生成的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392041/

相关文章:

java - 具有空数据和源文件 : inline evaluation of: `` 的 ListModel 中的 ZK NullPointerException

java - 使用iText(signdeferred)创建PDF数字签名,验证签名时出现invalid signature问题

java-me - 使用 Bouncy CasSTLe 库会导致输出 .jar 文件大小大幅增加

xml - 使用 dsig :Signature and TLS Client Certificate 签署 XML 消息的区别

c# - 使用 C#、BouncyCaSTLe 和导入的 RSA key 进行 RSA 签名和验证 - 内部工作的 Python 示例和非工作的 C# 代码示例

java.io.IOException : Stream closed using BouncyCaSTLe

java - 使用 Rest High Level Client 检索数据或将数据插入 Elastic Search 时出现 SocketTimeoutException

java - 使用@JsonTypeInfo为什么不能省略多态字段?

java - 在 Android 应用程序中使用代理服务器

security - 为方便起见,为什么不在 JWT 负载中包含公钥