3.4.4 DESKeySpec

DESKeySpec类与SecretKeySpec类都是提供秘密密钥规范的实现类。不同之处在于,DESKeySpec类指定了DES算法,SecretKeySpec类则是兼容所有对称加密算法。

DESKeySpec类有很多的同胞,例如,DESedeKeySpec类提供了三重DES加密算法的密钥规范;PBEKeySpec类提供了PBE算法的密钥规范。我们以DESKeySpec类为代表,对其同胞类做相应说明。


//此类指定一个DES密钥。

public class DESKeySpec

extends Object

implements KeySpec


❑方法详述

可以通过如下构造方法获得实例化对象:


/创建一个DESKeySpec对象,使用key中的前8个字节作为DES密钥的密钥内容。/

public DESKeySpec(byte[]key)

/创建一个DESKeySpec对象,使用key中始于且包含offset的前8个字节作为DES-EDE密钥的密钥内容。/

public DESKeySpec(byte[]key, int offset)


在上述方法中的8个字节的定义就来源于这个常量定义,如下所示:


//定义以字节为单位的DES密钥长度的常量(8)。

public static int DES_KEY_LEN


此外,DESKeySpec类还提供了如下方法:


//返回DES密钥内容。

public byte[]getKey()

/确定给定的始于且包含offset的DES密钥内容是否是奇偶校验的(parity-adjusted)。/

public static boolean isParityAdjusted(byte[]key, int offset)

//确定给定的DES密钥内容是否是全弱或者半弱的。

public static boolean isWeak(byte[]key, int offset)


❑实现示例

我们修改3.4.3节的内容来演示如何使用DESKeySpec类还原密钥对象。

先获得DES算法的密钥字节数组:


//实例化KeyGenerator对象,并指定DES算法。

KeyGenerator kg=KeyGenerator.getInstance("DES"));

//生成SecretKey对象。

SecretKey secretKey=kg.generateKey();

//获得密钥编码字节数组。

byte[]key=secretKey.getEncoded();


在得到密钥编码字节数组后,我们将通过如下方法还原秘密密钥对象:


//指定DES算法,还原SecretKey对象。

SecretKey secretKey=new SecretKeySpec(key,"DES");


如果使用DESKeySpec该如何做呢?在得到了密钥编码之后,可通过如下代码来实现:


//实例化DESKeySpec对象,获得DES秘密密钥规范。

DESKeySpec dks=new DESKeySpec(key);

//实例化SecretKeyFactory对象,并指定DES算法。

SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES");

//获得SecretKey对象

SecretKey secretKey=keyFactory.generateSecret(dks);


如果是三重DES算法,该怎么做呢?除了原有指明为“DES”算法的位置替换为“DESede”外,只需要把DESKeySpec类换为DESedeKeySpec类即可。示例代码如下:


//实例化,并指定DESede算法。

KeyGenerator kg=KeyGenerator.getInstance("DESede"));

//生成SecretKey对象。

SecretKey secretKey=kg.generateKey();

//获得密钥编码字节数组。

byte[]key=secretKey.getEncoded();


得到密钥编码之后,可通过如下代码来实现:


//实例化DESedeKeySpec对象,获得DESede秘密密钥规范。

DESedeKeySpec dks=new DESedeKeySpec(key);

//实例化SecretKeyFactory对象,并指定DESede算法。

SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DESede");

//获得SecretKey对象

SecretKey secretKey=keyFactory.generateSecret(dks);


其他对称秘密密钥规范的使用与上述代码实现大致相同,有兴趣的读者可以参考相应的API内容。