3.2.8 AlgorithmParameterGenerator
AlgorithmParameterGenerator类用于生成将在某个特定算法中使用的参数集合,我们把它称为算法参数生成器,它同样是一个引擎类。
//生成制定算法的参数集合。
public class AlgorithmParameterGenerator
extends Object
❑方法详述
AlgorithmParameterGenerator类同样需要通过getInstance()工厂方法完成实例化对象。
通过算法名称直接指定算方法参数生成器是最简便的实例化方法了,方法如下所示:
/返回生成与指定算法一起使用的参数集的AlgorithmParameterGenerator对象。/
public static AlgorithmParameterGenerator getInstance(String algorithm)
或者,指定算法的同时指明该算法的提供者,方法如下所示:
/返回生成与指定算法一起使用的参数集的AlgorithmParameterGenerator对象。/
public static AlgorithmParameterGenerator getInstance(String algorithm, Provider provider)
/返回生成与指定算法一起使用的参数集的AlgorithmParameterGenerator对象。/
public static AlgorithmParameterGenerator getInstance(String algorithm, String provider)
算法生成器共有两种初始化方式:与算法无关的方式或特定于算法的方式。
两种方式的唯一区别在于对象的初始化:
·与算法无关的初始化
所有参数生成器都共享“大小”概念和一个随机源。AlgorithmParameterGenerator类提供了两个init()方法,均包含参数int size,另一个方法则要求提供SecureRandom参数。使用这一方法时,特定于算法的参数生成值(如果有)默认为某些标准值,除非它们可以从指定大小派生。
·特定于算法的初始化
使用特定于算法的语义初始化参数生成器对象,这些语义由特定于算法的参数生成值集合表示。有两个initialize()方法具有AlgorithmParameterSpec参数,其中一个方法还有一个SecureRandom参数,而另一个方法使用以最高优先级安装的提供者的SecureRandom实现作为随机源。(如果任何安装的提供者都不提供SecureRandom的实现,则使用系统提供的随机源。)
与算法无关的初始化方法如下:
//针对某个特定大小初始化此AlgorithmParameterGenerator对象。
public final void init(int size)
//针对某个特定大小和随机源初始化此AlgorithmParameterGenerator对象。
public final void init(int size, SecureRandom random)
特定于算法的初始化方法如下:
/利用特定于算法的参数生成值集合初始化此AlgorithmParameterGenerator对象。/
public final void init(AlgorithmParameterSpec genParamSpec)
/利用特定于算法的参数生成值集合初始化此AlgorithmParameterGenerator对象。/
public final void init(AlgorithmParameterSpec genParamSpec, SecureRandom random)
在完成实例化对象操作后,我们就可以通过以下方法生成算法参数对象了:
//生成AlgorithmParameters对象。
public final AlgorithmParameters generateParameters()
此外,算法生成器还提供以下常用方法:
//返回与此参数生成器关联的算法的标准名称。
public final String getAlgorithm()
//返回此算法参数生成器对象的提供者。
public final Provider getProvider()
❑实现示例
在3.2.7节中,本书曾提到用于AlgorithmParameter初始化的字符串(19050619766489163472469)是通过AlgorithmParameterGenerator操作来生成的。代码清单3-8就是获得该字符串的代码:
代码清单3-8 通过算法参数生成器获得DES算法相应的算法参数
//实例化AlgorithmParameterGenerator对象,并指定DES算法。
AlgorithmParameterGenerator apg=AlgorithmParameterGenerator.getInstance("DES");
//初始化。
apg.init(56);
//生成AlgorithmParameters对象。
AlgorithmParameters ap=apg.generateParameters();
//获得参数字节数组。
byte[]b=ap.getEncoded();
/打印经过BigInteger处理后的字符串,该字符串就是"19050619766489163472469"/
System.out.println(new BigInteger(b).toString());
当使用Java提供的加密组件时,很少会用到AlgorithmParameters和AlgorithmParameter-Generator两个类,当对算法参数要求极为严格的情况下才会考虑使用这种方式。