3.4 java.security.spec包和javax.crypto.spec包详解

java. security.spec包和javax.crypto.spec包都提供了密钥规范和算法参数规范的类和接口。获得密钥规范后,我们将有机会还原密钥对象。本节将详述KeySpec接口及其实现。

3.4.1 KeySpec和AlgorithmParameterSpec

KeySpec和AlgorithmParameterSpec是java.security.spec包中两个较为重要的接口。这两个接口本身都是空接口,仅用于将所有参数规范分组,并为其提供类型安全。

1.KeySpec

此接口不包含任何方法或常量。它仅用于将所有密钥规范分组,并为其提供类型安全。所有密钥规范都必须实现此接口。


//组成加密密钥的密钥内容的(透明)规范。

public interface KeySpec


KeySpec的抽象实现类(EncodedKeySpec)构建了用于构建公钥规范和私钥规范的两个实现(X509EncodedKeySpec用于构建公钥规范,PKCS8EncodedKeySpec用于构建私钥规范)。

SecretKeySpec接口是KeySpec的实现类,用于构建秘密密钥规范。

2.AlgorithmParameterSpec

此接口不包含任何方法或常量。它仅用于将所有参数规范分组,并为其提供类型安全。所有参数规范都必须实现此接口。


//加密参数的(透明)规范。

public interface AlgorithmParameterSpec


AlgorithmParameterSpec接口有很多的子接口和实现类,用于特定于算法的初始化。使用起来也很方便,只需要使用指定参数填充构造方法即可获得一个实例化对象。我们以DSAParameterSpec为例:

//此类指定用于DSA算法的参数的集合。


public class DSAParameterSpec

extends Object

implements AlgorithmParameterSpec, DSAParams


通过以下方法获得实例化对象:


//创建一个具有指定参数值的新的DSAParameterSpec。

public DSAParameterSpec(BigInteger p, BigInteger q, BigInteger g)


在上述参数中,p为素数、q为子素数、g为基数。通过给定的数学参数构造实例化对象。

获得对象后可通过如下方法获得其属性值:


//返回基数g

publi c BigInteger getG()

//返回素数p

public BigInteger getP()

//返回子素数q

public BigInteger getQ()


此外,还有很多AlgorithmParameterSpec接口的实现,基本上与DSAParameterSpec类的使用方式相似,有兴趣的读者可以查看相应的API文档。