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文档。