在Java开发中,为提高运行效率,很多对象采用静态方法实例化。JCA通过各种类的getInstance静态方法来返回密码算法实例化对象,开发者需要获得方法的正式名称作为参数才能完成实例化调用。因此在验证完Java密码技术实践环境有效后,开发者还需要提前获取当前JCA和BC库所支持密码实现方法的各种算法名称信息,以便后续为各种密码应用实现过程提供实例化调用。获取密码算法名称信息的方法有两种,即查询官网文档和通过代码获取。
查询官网文档的方法获取密码算法名称虽然比较简单,但是想要获得具体的算法仍需要仔细查找众多文档信息,比较耗时。在读者对算法不是足够熟悉的情况下,可以采用这种方法。因为多查阅官方文档是非常有好处的,一方面文档中给的信息更多,能全面了解算法;另一方面文档中有不少经典示例,可供开发者参考。
通过代码获取的方式,是通过调用JCA底层security类getalgorithms的方式来返回目前加密服务的所有可用算法信息。这种方法比较快捷,适合已有一定Java开发经验且对JCA非常熟悉的程序员使用。以下是两种方法的实现过程。
在官网的文档资料里面查询算法信息,比如JCA、JCE的官方文档,还有BC库的官方文档。网站地址如下:
如果对算法足够了解,为了快捷开发,直接在程序中通过代码查询更方便。下面的实践就是针对代码查询的方法。本节以获取密钥生产类KeyGenerator算法信息为例,看看如何通过程序代码获得密钥生产类中包含的算法信息。
(1)实现步骤
1)直接用Eclipse开发工具新增加一个类getAlgorithmsName,注意直接勾选main方法。本例就在这个类中用代码查询算法名字。
2)在main函数开头将常用的BC库添加到工程Provider列表中。
3)将KeyGenerator类中可以使用的算法名称输出,以便后续实例化对象。
4)使用KeyGenerator类getInstance静态方法来返回密码算法实例化对象,参数是前一步输出的算法名称。
(2)实现代码
(3)代码结果输出
在编者的开发环境下,该行语句输出了三百多行,鉴于篇幅有限,截取部分输出结果展示如下:
以上代码首先是用JCA的Security类的getAlgorithms()方法获取KeyGenerator类所支持的算法名称;再使用KeyGenerator的getInstance()方法返回密码算法实例化对象,最终完成对具体密码算法的功能调用。
Security.getAlgorithms("KeyGenerator")返回的是所有“KeyGenerator”类支持的算法名字,其返回值是个set集合对象,代码直接调用了forEach将集合中的每一个名字都打印出来。在编者的环境下,该行语句输出了三百多行,鉴于篇幅有限,输出截取一部分进行展示,可以看出对应产生对称密钥的"KeyGenerator"类有很多常用算法都可以使用。
KeyGenerator.getInstance("SM4-CMAC")是使用静态方法来返回具体密码算法实例化对象,完成算法功能调用。"SM4-CMAC"可以用获取的任何一个算法名字代替,如KeyGenerator.getInstance("ZUC-128")、KeyGenerator.getInstance("BLOWFISH")等。如果算法名字输出太多,Eclipse界面可能显示不完全,读者可以直接将输出通过文件接口输出保存到本地文件中,以备后续编码过程中查看。
下面请读者思考,接下来如何获取密钥对生成服务“KeyPairGenerator”类所支持的算法名称,并完成算法的实例化调用呢?实际上还是采用完全类似的步骤来实现。
1)获取算法名字。
2)完成算法实例化调用。
以此类推,常用的各种算法输出方式如下。
值得注意的是, 在提供给算法的所有算法名字中,是不需要区分大小写的 ,“KeyFactory”和“keyfactory”都可以正常使用,而且都能查询出算法列表名字,但还是强烈建议按照通常的书写规范进行,这样方便以后的代码阅读和规范化。
读者不要对众多的算法名字产生恐惧,随着后续章节对各种密码算法的具体深入介绍,读者对算法名称也会越来越熟悉,毕竟商用密码算法的标准类型不是太多,多练习几次就记住了。