avh*_*avh 5 java openssl bouncycastle
我有一个软件进行数字签名,如下所示。
MessageDigest md = MessageDigest.getInstance("SHA1", "BC");
Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] hash = md.digest("message".getBytes());
byte[] signature = cipher.doFinal(hash);
Run Code Online (Sandbox Code Playgroud)
我想用批处理/openssl 的一些行替换它,但未能重现此签名。基本上它是 SHA1 和 RSA 的组合,这还不错。我想知道为什么哈希和加密是分开的。使用 openssl 执行此操作的两种方法都会产生不同的签名(忽略格式):
openssl dgst -sha1 -binary msg.txt > hash
openssl rsautl -sign -inkey priv.pem -in hash -hexdump
Run Code Online (Sandbox Code Playgroud)
和
openssl dgst -sha1 -sign priv.pem -hex < msg.txt
Run Code Online (Sandbox Code Playgroud)
所以我缺少一些东西......
更新:
感谢您的意见!当然,这段Java代码不是正确进行签名的方法,但是验证的代码不在我手中,我的目标是创建一个可以验证的签名。不过,我会提出改变整个事情的建议。
但我终于成功地重现了签名。我自己不回答这个问题,因为我想要一个合适的 openssl 解决方案。这就是我得到的:
上面的Java代码做了填充!哈希码预填充了零字节,长度为 256!
到目前为止,我发现的最佳解决方案是使用 236 个零字节(填充)和另一个临时文件(哈希)进行手动填充。
COPY padding hash
openssl dgst -sha1 -binary msg.txt >>hash
openssl pkeyutl -sign -in hash -inkey priv.pem -out signature -pkeyopt rsa_padding_mode:none
Run Code Online (Sandbox Code Playgroud)
我尝试改用openssl dgst并指定各种填充方案,但没有成功。我认为 openssl 不支持这种填充方案,并怀疑它是否是标准方案。
| 归档时间: |
|
| 查看次数: |
2046 次 |
| 最近记录: |