1 回答
TA贡献1847条经验 获得超11个赞
OpenSSL 需要 X9.62 签名。这包括两个整数值 R 和 S 的 DER 编码。如果您查看提供程序类的 Bouncy Castle 源代码,SignatureSpi您会发现:
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(new ASN1Integer(r));
v.add(new ASN1Integer(s));
byte[] derEncodedSignature = new DERSequence(v).getEncoded(ASN1Encoding.DER);
这是您应该使用 Bouncy Castle 对签名进行编码的内容。这里r和s应该是BigInteger你在两个元素结果数组中得到的值。
您可能已经猜到了,您也可以使用 Java JCASignature类来代替,这将产生相同的签名编码。如果需要或想要,您可以通过注册/指示提供者来使用 BouncyCastle 实现作为底层提供者。有趣的是,Bouncy Castle 库现在有一个非常快的 EC 实现,它击败了 Oracle 提供的实现,即使它是在本机代码中。
该二进制输出与用于OpenSSL的签名输入直接兼容。要创建文本字符串,可以将字节数组编码为 base 64 字符串(最好没有行结尾,例如Base64.encode(derEncodedsignature)),然后必须通过openssl enc -base64 -A -d -in signature.txt -out signatureToVerify.bin
添加回答
举报