3.2.7 AlgorithmParameters

AlgorithmParameters类是一个引擎类,它提供密码参数的不透明表示。

不透明表示与透明表示的区别在于:

·不透明表示:在这种表示中,不可以直接访问各参数域,只能得到与参数集相关联的算法名及该参数集的某类编码。

·透明表示:用户可以通过相应规范类中定义的某个“get”方法来分别访问每个值。


//提供密码参数不透明表示。

public class AlgorithmParameters

extends Object


❑方法详述

可以通过getInstance()工厂方法实例化AlgorithmParameters对象,如下所示:

通常,我们使用如下方法获得实例化对象:


//返回指定算法的AlgorithmParameters对象。

public static AlgorithmParameters getInstance(String algorithm)


当然,我们可以同时指定算法的相应提供者来完成实例化操作,可使用如下方法:


//返回指定算法的AlgorithmParameters对象。

public static AlgorithmParameters getInstance(String algorithm, Provider provider)

//返回指定算法的AlgorithmParameters对象。

public static AlgorithmParameters getInstance(String algorithm, String provider)


完成对象实例化后,需要对其进行初始化:


//使用在paramSpec中指定的参数初始化此AlgorithmParameters对象。

public final void init(AlgorithmParameterSpec paramSpec)

//根据参数的基本解码格式导入指定的参数字节数组并对其解码。

public final void init(byte[]params)

//根据指定的解码方案从参数字节数组导入参数并对其解码。

public final void init(byte[]params, String format)


AlgorithmParameters对象只能被初始化一次,无法重用。

在上述init()方法中,我们看到AlgorithmParameterSpec参数,它是加密参数的(透明)规范接口,位于java.security.spec包中,其接口内部无任何方法,仅用于将所有参数规范分组,并为其提供类型安全。所有参数规范都必须实现此接口。

在完成初始化后,可通过以下方法获得参数对象的规范:


//返回此参数对象的(透明)规范。

public final<T extends AlgorithmParameterSpec>T getParameterSpec(Class<T>paramSpec)


我们可以通过以下方法获得算法参数:


//返回基本编码格式的参数。

public final byte[]getEncoded()

//返回以指定方案编码的参数。

public final byte[]getEncoded(String format)


此外,AlgorithmParameters类提供了以下常用方法:


//返回与此参数对象关联的算法的名称。

public final String getAlgorithm()

//返回此参数对象的提供者。

public final Provider getProvider()

//返回描述参数的格式化字符串。

public final String toString()


❑实现示例

我们通过代码清单3-7来展示如何使用AlgorithmParameters类获得算法参数。

代码清单3-7 构建DES算法参数


//实例化AlgorithmParameters,并指定DES算法。

AlgorithmParameters ap=AlgorithmParameters.getInstance("DES");

//使用BigInteger生成参数字节数组。

ap.init(new BigInteger("19050619766489163472469").toByteArray());

//获得参数字节数组。

byte[]b=ap.getEncoded();

/打印经过BigInteger处理后的字符串,将会得到与"19050619766489163472469"相同的字符串/

System.out.println(new BigInteger(b).toString());


上述字符串(19050619766489163472469)是作者通过AlgorithmParameterGenerator类操作得到的,并不是随意填写的一个数值。