这很复杂,但是我会尽力解释。我想我将从Java开始。我的讨论针对Java 6,我不确定Java 7中发生了什么变化。
Java的内置密码可通过Java密码扩展(JCE)获得。此扩展包含两个部分,即应用程序API和服务提供商API。应用程序API是您与之交互的部分。您使用
getInstance()各种加密类的工厂方法。对于普通程序员而言,服务提供者方面会更加混乱。他们不在乎加密的实现方式,只是想要一些有效的方法。但是在后台,有加密货币提供程序类可以完成实际工作。如果您看一下
getInstance()您会看到您可以根据需要指定提供程序。你为什么要呢?也许您已经为优化的RSA商业实现方式支付了$$$费用,所以您想使用它。也许某个提供商拥有您的应用程序所需的FIPS证书或其他证书。然后,您将指定该提供程序。Sun
/
Oracle将其Java环境与几个提供程序一起提供,这些提供程序一起构成了Java环境的默认提供程序集。不要太仔细地看它们,因为它们重叠并且由于历史文物而有些混乱。基本上,当使用Oracle
Java时,您要求提供诸如加密这样的加密货币
KeyPairGenerator,
KeyPairGenerator.getInstance("RSA");您将从这些提供程序之一中获取适当的类实例。接下来,让我们看看bouncycastle。bouncycastle库由两部分组成。一个是他们独特的加密库,您在上面的#2中试验了其API。第二部分是很多粘合代码,以允许该库用作JCE的crypt提供程序。这意味着作为程序员,您可以选择如何使用Bouncycastle加密库。您可以像上面的#2中一样直接使用其API。或者,您可以使用JCE
api,但可以通过来明确指定bouncycastle实现
KeyPairGenerator kpg =KeyPairGenerator.getInstance("RSA", "BC");。如果您更喜欢直接使用唯一的bouncycastle
API(它们称为“轻量级API”),那么就不需要用于使其成为JCE提供程序的所有粘合代码。为此,bouncycastle确实提供了轻量级API类的下载。
现在,最后,我们来看一下Android的实现。Google没有许可Oracle的Java源代码,因此他们没有任何Oracle的JCE提供程序。他们必须提供自己的提供商。由于bouncycastle具有所需的所有代码,并且是开源的并获得了免费许可,因此Google
/
Android选择使用bouncycastle作为其默认JCE提供程序的基础。但是,Android并未努力为Android程序员提供独特的轻量级API。他们希望您仅通过JCE使用这些类。他们已经修改了Bouncycastle代码,以针对Android对其进行调整。他们认为您可以找到甚至使用
一些 直接在Android上使用轻量级API的事实只是其底层存在的副作用。并非一切都在那里。有人将这种情况描述为“ Android上的充气城堡已瘫痪”。
为了在Android上实际提供bouncycastle库的全功能版本,一些开发人员开发了一种称为Spongycastle库的东西。它无非就是修改了bouncycastle库,以便它可以在Android上运行。主要修改是为了更改包名称
org.bouncycastle.*,
org.spongycastle.*以防止名称空间冲突。
那你应该用什么呢?这取决于您想要做什么,您的可移植性需求是什么,您的样式偏好是什么以及您的加密技术水平是什么。通常,当您使用这些库时,您使用的加密级别相当低。您将重点放在如何做(使用RSA进行密钥传输,使用AES进行消息加密,使用HMAC-
SHA256进行消息完整性等)与做什么(我想通过电子邮件将加密的消息发送给收件人)上。类似机制)。显然,如果可以的话,您应该使用直接解决问题的高级库。这些库已经了解PKCS#1是什么,以及如何将其用作更大更完整协议的一部分。



