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内容。