【发布时间】:2019-01-15 14:00:17
【问题描述】:
我已经尝试了几个星期来使用 bouncycastle 和 java 重现一些 openssl 命令。
在跟踪了大量示例并尝试了 Stackoverflow 中的大量示例之后,我仍然无法使其工作,这就是我现在寻求帮助的原因。
我必须重现的 openssl 命令是:
openssl smime -sign -in fileToSign.eml -out signedFile.step2 -passin pass:« password» -binary -nodetach -signer myprivatecert.pem -certfile mypubliccert.pem
第一个命令需要 3 个文件,要签名的文件、私有证书和公共证书。
它返回一个看起来像这样的文件:
MIME 版本:1.0 内容处置:附件; filename="smime.p7m" 内容类型:application/x-pkcs7-mime; smime 类型=签名数据; name="smime.p7m" 内容传输编码: base64
MIJAYAYJKoZIhvcNAQcCoIJAUTCCQE0CAQExDzANBglghkgBZQMEAgEFADCCNTUG CSqGSIb3DQEHAaCCNSYEgjUiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7 CmJvdW5kYXJ5PSItLS0tPUxPR0lQT0xfTUlGXzE1NDY4NTAwNDc4MTYiCi0tLS0t LT1MT0dJUE9MX01JRl8xNTQ2ODUwMDQ3ODE2DQpDb250ZW50LVR5cGU6IHRleHQv WE1MOw0KbmFtZT0iUERBX1A5MDAxMjZfMDA1XzIwMTkwMTA3LjA5MzIwMF8wMDAw MV9JTklULnhtbCI7IGZpbGVuYW1lPSJQREFfUDkwMDEyNl8wMDVfMjAxOTAxMDcu MDkzMjAwXzAwMDAxX0lOSVQueG1sIg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGlu ZzogYmFzZTY0DQoNClBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52Wkds dVp6MGlWVlJHTFRnaVB6NDhUVWxHVmtGUFNXNW1iMGx1YVhScFlXeGwNClBnbzhT VzVtYjNNK0NqeFdaWEp6YVc5dVBqSXVPVHd2Vm1WeWMybHZiajRLUEVodmNtOWtZ WFJsUGpJd01Ua3RNREV0TURkVU1EazYNCk16UTZNRGM4TDBodmNtOWtZWFJsUGdv OFUyRnBjMmxsU0c5eWIyUmhkR1UrTWpBeE9TMHdNUzB3TjFRd09Ub3pNam93TUR3...
我必须使用的第二个命令是:
openssl smime -encrypt -in signedFile.step2 -out encryptedFile.P7M -outform DER -binary anotherpubliccertificate.pub.pem
此命令需要 2 个文件,由上一个命令签名的文件和一个公共证书,与上一个命令中使用的不同。
这会返回一个二进制文件,一个从第 2 步生成的加密文件。
我在互联网上找到的任何示例都帮助我获得了一个看起来像以前的文件的文件,甚至不接近。
希望有人能帮忙
编辑 到目前为止,我尝试或参考的一些示例
sign file with bouncy castle in java -> 这返回了一个与 openssl 生成的签名文件不对应的签名文件
AES encrypt/decrypt with Bouncy Castle provider -> 同样,这不起作用,结果与我使用 openssl 生成的加密文件不对应
https://studylibfr.com/doc/3898805/cryptographie-avec-bouncy-castle---zenk -> 一直在关注整个教程,没有得到预期的结果
X509 RSA bouncy castle sign and verify plain text in Java -> 签名文件也不对应
https://github.com/bcgit/bc-java/blob/master/mail/src/main/java/org/bouncycastle/mail/smime/examples/CreateSignedMultipartMail.java -> 这个类生成的东西和我想要得到的东西很相似,但我无法测试它的有效性,因为我必须对其进行加密,但仍然无法进行加密
https://github.com/bcgit/bc-java/blob/master/mail/src/main/java/org/bouncycastle/mail/smime/examples/SendSignedAndEncryptedMail.java -> 这种加密方法返回的结果与 openssl 不同,所以它不起作用
当然,我已经尝试继续研究 bouncycastle 中的这些示例类,但没有成功。
任何帮助将不胜感激
编辑 2 以下问题Sign and encrypt a file using S/MIME 的答案返回一个Base64 编码文件,该文件可能与我使用openssl 生成的文件相对应。但问题是我的入口文件大约25kb,生成的签名文件只有3kb,我不明白为什么,我注意到在这一行:
CMSTypedData content = new CMSProcessableByteArray(buffer);
CMSSignedData signedData = signGen.generate(content, false);
byte[] signeddata = signedData.getEncoded();
getEncoded() 方法返回的字节数组比我发送到 CMSSignedData 的缓冲区小得多。
有人知道原因吗?
【问题讨论】:
-
将二进制格式解释为文本是愚蠢的;查找 DER 的含义。
-
我知道 DER 是什么意思,谢谢,这并不能帮助我理解如何使文件看起来相似。我写了这些字符作为它的外观示例
-
我猜这就是人类发明十六进制的原因。如果您了解 DER,那么您不会发布对它的 UTF-8 解码。零序先生。对于这类问题,您应该发布您迄今为止开发的代码。
-
正如我上面的问题所说,我尝试了很多样本,字面意思是这么多,我不能只发布我所做的一切,因为我尝试的一切都没有返回我必须得到的结果.我问这个问题是希望有人能得到这个结果,而不是展示我尝试过和失败的一切,但我会编辑我的问题并添加一些我尝试过的例子
标签: java encryption cryptography bouncycastle sign