java - 没有 JCE 的 Java 中的 S/MIME

标签 java bouncycastle jce smime

我正在尝试编写一个可以使用 S/MIME 签署电子邮件的小程序。

显然我想制作一个小 jar ,只包含所需的东西。 显然,Java 的方法涉及到有一个巨大的神圣签名 Bouncy CaSTLe JCE jar 。

问题是:在不接触 JCE 并让它提示“验证”“提供者”的情况下获取 S/MIME 的最简单方法是什么?也许有一个不依赖于 JCE 的 S/MIME 实现?也许可以使用 Bouncy CaSTLe S/MIME 来使用其轻量级 API,而无需接触 JCE?也许还有其他方法吗?

对我来说很明显,无论Sun是否批准,没有什么可以阻止纯java开源加密算法的工作,所以这不是理论上可能性的问题,而是:哪种方式最不痛苦?

当然,我总是可以通过获取 Bouncy CaSTLe 纯 java JCE 实现、将其包重命名为 java.security1 并进行任何我想要的更改来尽早变得丑陋 - 但这种方式现在看起来太痛苦了。

更新我当前直接使用 Bouncy CaSTLe 的问题:我尝试从 keystore 加载 key ,这涉及使用 SecretKeyFactory,这反过来会拒绝我的 Bouncy CaSTLe 构建。

最佳答案

BC S/MIME 是通过 CMS 包编写的,因此问题实际上是修改 CMS 包,以便所有加密都是使用轻量级类完成的。

类似的事情已经在 Bouncy CaSTLe 的 .NET 版本中完成,或多或少是成功的。我们正在尝试(诚然,这是一个缓慢的过程)重构 Java 版本,以便 CMS 内容可以与 JCE 或轻量级一起使用。同样的问题也会影响 BC API 的其他部分,例如PKCS#12 keystore 内置于 JCE 提供程序中,OpenPGP 包写入 JCE 等。这些的 .NET 端口也将它们重写为轻量级 API。

不过,您的问题可能比一般情况更简单。想必您只需要 CMSSignedDataGenerator 和支持类。您可能不需要 addSigner 或generate 的所有无数变体。如果您只是预先决定摘要/签名算法,那么所有提供程序的内容都将很容易替换为对特定轻量级实现的硬编码调用。

也许您可以只在 PKCS#8 文件(可能是 PEM 编码)中存储单个私钥,而不是 keystore 。证书也是如此。

关于java - 没有 JCE 的 Java 中的 S/MIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2223104/

相关文章:

java - 如何使用java正则表达式识别字符的第四次出现

java - 使用 Bouncy CaSTLe 解密 PEM 私钥 (RSA)

c# - 仅使用 C、指数和模数的 RSA 解密

java - PBEWithSHA1AndTripleDES 与 PBEWithSHA1And3KeyTripleDES

Java - 4 线程在两个同步方法中操作相同的对象数据

java - 如何跳转到Intellij中变量的初始化

java - 将值从 Servlet 发送到 JSP,无需 cookie,并且 session 不会显示在 URL 上

c - MbedTLS 和 .NET BouncyCaSTLe 与 Curve25519 的互操作性问题

ssl - Cassandra 抛出 SSLFactory.java 警告

java - 是否有一种实用的方法来确定正在使用哪些 JCE 加密提供程序?