15.3.2 使用Bouncy Castle API加密和解密
Bouncy Castle API通过加密引擎(位于org.bouncycastle.crypto.引擎中)来提供密码实现,这些引擎实现了特定的接口,比如 AsymmetricBlockCipher、BlockCipher或StreamCipher(所有这些接口都可以在 org.bouncycastle.crypto包中找到)。这些接口都具有一个共同的用途:它们让你初始化密码,以字节数组的形式提供要被加密或解密的 数据(既可以以块的形式也可以作为消息流的一部分提供),然后执行加密或解密操作。与使用JCA和SATSA-CRYPTO API一样,当初始化一个密码实现时,你指定想要该实现执行加密还是解密,以及操作中要使用的密钥细节。使用Bouncy Castle API通过RC4算法执行加密,可以编写如代码清单15-6所示的代码。
代码清单15-6 使用Bouncy Castle API执行RC4加密
与生成消息摘要时一样,Bouncy Castle API的接口在概念上类似于JCA和SATSA-CRYPTO API,但并不完全相同。再一次,直接实例化引擎,而不是使用一个工厂创建想要的密码引擎。通过类似方法初始化生成的引擎,指定想要引擎进行加密(传递 true)还是解密(传递false),以及引擎的init方法的一些选项。最后,将要加密或解密的字节传递给引擎以供处理。引擎接受你想要其处理的字节 的方式取决于它实现的是块密码还是流密码。使用processBlock方法将字节传递给块密码或非对称块密码,每次传递一个完整的块。可以调用 getBlockSize方法来确定块密码的块大小,或分别调用getInputBlockSize和getOutputBlockSize方法来确定非 对称块密码的输入块和输出块的大小。使用processBytes方法将字节传递给流密码。
无论处于哪种情形,密码引擎都会将结果返回给你调用的方法以供处理。此方法可能抛出多个异常中的一个,如果数据数组的长度无效,则抛出DataLengthException,或者如果初始化密码失败,则抛出IllegalStateException。
此示例使用RC4算法(一种安全性相对较弱的算法),但Bouncy Castle API中还包含许多有其他支持的密码算法。与SATSA-CRYPTO API不同,这些算法可同时针对对称和非对称密码进行实现,因此,同时需要公钥密码的加密和解密功能的应用程序可使用Bouncy Castle API获益,而使用SATSA-CRYPTO API则不能实现此目的。
除了支持许多不同密码算法,Bouncy Castle API还为其支持的密码提供了密钥生成算法。这是该API的一个重要特性,因为在编写应用程序时,安全的密钥生成和分发至关重要。 org.bouncycastle.crypto.generators包含的类中包括受支持的密码的生成器;创建密钥只需创建合适的生成器并调用一个方 法。例如,要为DES创建一个随机密钥,可以编写代码清单15-7中所示的代码。
代码清单15-7 生成随机密钥
一些密钥生成器必须首先进行初始化,因此需要确保检查了所选的密码系统和密钥生成器的文档。这些密钥生成器通常提供了公钥密码算法的密钥,其中包括两个密钥(一个是分发给其他团体的公钥,另一个是用于解密的私钥),这两个密钥分别用于消息加密和解密。
注意 尽管安全密钥生成是Bouncy Castle API提供的一个重要功能,但仅适用该功能还远远不够。应用程序使用其密钥的方式与创建密钥的方式同样重要;弱存储或交换(比如通过不安全的网络通道共享对称密码算法的密钥)抵消了出色的密钥生成算法的强大作用。
原文地址:http://book.51cto.com/art/200908/145125.htm[转载]