如何通过 java 实现 openssl pkeyutl -sign

how can realize openssl pkeyutl -sign by java

命令行是

openssl pkeyutl   -sign -inkey pkcs1.pem -pkeyopt digest:sha1  -in testlog 

我想通过java实现。 但是 NONEwithRSA 或 SHA1withRSA 都不会给出相同的输出。 NONEwithRSA 的输出与

相同
openssl pkeyutl   -sign -inkey pkcs1.pem   -in testlog 

没有-pkeyopt digest:sha1

java 代码就像

 Signature sign = Signature.getInstance(algorithm);
 sign.initSign(privatekey);
 sign.update(keyByte);
 return sign.sign();

不知道怎么修改。

非常感谢

我真正想做的是通过Java

实现C函数
RSA_sign(NID_sha1, token, token_size, sig, &len, key->rsa)

哪个不散列明文

https://github.com/usb4java/usb4java-javax-examples/blob/97b95c80e8af87f935f736ed7b4f4a197d4643ac/src/main/java/org/usb4java/javax/examples/adb/Adb.java 这个可以满足我的需求。

openssl pkeyutl -sign 使用 RSA 私钥和 -pkeyopt digest:$alg 执行 EMSA-PKCS1-v1_5 的第 2-5 步加上私有 modexp(即 8.2.1 第 2 步使用来自 5.2.1 的 RSASP1) ;没有那个 -pkeyopt 它不会执行步骤 2,该步骤将哈希值编码为简单的 ASN.1 结构。

Java Signature 算法包含像 SHA1withRSA 这样的散列,执行 所有 步骤 EMSA-PKCS1-v1_5 加上 modexp,而该方案 NONEwithRSA 仅执行步骤 3-5 加上 modexp,这些都不符合您的要求。如果您无法提供让 Signature 进行散列的数据,您将需要 自己执行第 2 步 然后 NONEwithRSA。虽然 ASN.1 编码通常可能很复杂(解码更是如此),但这种情况可以简单地 通过将完全由哈希算法确定的前缀连接到哈希值 来完成;请参阅第 47 页的注释 1。

Meta:关于 openssl rsautlpkeyutl 有和没有的 RSA v1_5 签名之间的差异,有 很多 个问题-pkeyopt digestdgst -sign 和 Java 等其他系统,都与包含或不包含 ASN.1 编码步骤的问题有关(其中许多比 rfc8017 更早!)但是我找不到任何适合这个问题的东西。