2

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

显然我想用只需要的东西做一个小罐子。显然,Java 的做法包括在周围放置一个巨大的神圣签名 Bouncy Castle JCE 罐子。

问题是:在不接触 JCE 并让它抱怨“身份验证”“提供者”的情况下获得 S/MIME 的最简单方法是什么?也许有一个不依赖于 JCE 的 S/MIME 实现?也许可以在不接触 JCE 的情况下使用 Bouncy Castle S/MIME 使用他们的轻量级 API?也许还有其他方法?

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

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

更新我目前直接使用 Bouncy Castle 的问题:我尝试从密钥库加载密钥,这涉及使用 SecretKeyFactory,这反过来又拒绝了我的 Bouncy Castle 构建。

4

2 回答 2

2

BC S/MIME 是在 CMS 包上编写的,所以问题真正转移到修改 CMS 包上,以便所有加密都使用轻量级类完成。

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

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

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

于 2010-02-13T07:01:59.417 回答
1

在不使用 JCE 的情况下签署消息非常简单。真正的问题是读取 PKCS#12 密钥。

我这样做了: * 复制了 JDKPKCS12KeyStore 类。* 在其中的任何地方,将 Security.getInstance() 替换为 bcProvider.getService().newInstance() (返回 Spi-s) * 在那些 Spi-s(在 BC 来源)中,将所需的方法设为公开而不是受保护。

它看起来像一个黑客,但似乎确实有效。

于 2010-02-16T14:49:37.990 回答