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两个类,当对算法参数要求极为严格的情况下才会考虑使用这种方式。