两行代码:
KeyPairGenerator.getInstance("RSA")
KeyPairGenerator.getInstance("RSA", "BC")
效果很好。那么,使用 BC 有什么区别呢?
BC 是否与使用的默认 RSA 完全兼容?(使用 Sun JDK 6)
返回
KeyPairGenerator
为指定算法生成公钥/私钥对的对象。此方法遍历已注册的安全提供者列表,从最喜欢的提供者开始。返回一个新的 KeyPairGenerator 对象,该对象封装 来自支持指定算法的第一个 Provider的 KeyPairGeneratorSpi 实现。
请注意,可以通过该
Security.getProviders()
方法检索已注册提供者的列表。
链接的 JavadocSecurity.getProviders()
依次说明以下内容:
返回一个包含所有已安装提供程序的数组。数组中提供者的顺序是他们的偏好顺序。
好吧,显然,在您的情况下,BC 是“巧合”的第一个首选提供商。如果它周围有不确定性(即你想分发应用程序并且你无法控制最终用户的环境)并且你想让它坚持使用 BC,那么你应该更喜欢使用第二个构造函数。
在BouncyCastle FAQ中有一些与 RSA 实现细节相关的条目。
我个人没有发现任何关于 Sun 和 BC 提供程序不兼容的文章,如果 BouncyCastle 依赖可以完全放弃,我建议使用 Java 的本地 RSA 实现。只有在有明确定义的好处时,您才应该添加外部依赖项。
如果您在项目的其他地方使用 BC 库,我想使用哪个提供程序并不重要。
编辑
J2ME 不包括 RSA 实现。因此,如果您计划有时将您的应用程序移植到 J2ME,BouncyCastle 库是现在的正确选择。
“BC”返回加密算法的 BouncyCastle 实现。
如果您不指定提供者,它将返回加密算法的“最受青睐”实现,即位置 1 的提供者是提供者数组中最受青睐的。