随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
此类位于javax.crypto.spec 包下。声明如下:
public class DESKeySpec extends Object implements KeySpec
此类指定一个 DES 密钥。
KeySpec是一个接口,用来组成加密密钥的密钥内容的(透明)规范。如果密钥存储在硬件设备上,则其规范可以包含有助于标识该设备上的密钥的信息。
用特定于算法的方法或独立于算法的编码格式(例如,ASN.1)可以指定密钥。例如,DSA 专用密钥可以由其组件 x
、p
、q
和 g
指定(请参见 DSAPrivateKeySpec
),或使用其 DER 编码指定(请参见 PKCS8EncodedKeySpec
)。
此接口不包含任何方法或常量。它仅用于将所有密钥规范分组,并为其提供类型安全。所有密钥规范都必须实现此接口。
1、字段:DES_KEY_LEN 值为8, 定义以字节为单位的 DES 密钥长度的常量。
2、构造方法:
①public DESKeySpec(byte[] key) throws InvalidKeyException
创建一个 DESKeySpec 对象,使用 key
中的前 8 个字节作为 DES 密钥的密钥内容。
组成 DES 密钥的字节在 key[0]
和 key[7]
范围内(包含两者)
参数: key
- 具有 DES 密钥内容的缓冲区。复制该缓冲区的前 8 个字节来防止后续修改。
抛出异常:如果给定的密钥内容短于 8 个字节。会抛出InvalidKeyException异常。
②public DESKeySpec(byte[] key,int offset) throws InvalidKeyException
创建一个 DESKeySpec 对象,使用 key
中始于且包含 offset
的前 8 个字节作为 DES-EDE 密钥的密钥内容。
组成 DES 密钥的字节在 key[offset]
和 key[offset+7]
范围内(包含两者)。
参数:
key
- 具有 DES 密钥内容的缓冲区。复制该缓冲区始于且包含 offset
的前 8 个字节来防止后续修改。
offset
- key
中的偏移量,DES 密钥内容从此处开始。
抛出异常:同上
3、方法详细:
①public byte[] getKey() 返回 DES 密钥内容。每一次调用此方法都返回一个新数组。
②public static boolean isParityAdjusted(byte[] key, int offset) throws InvalidKeyException
确定给定的始于且包含 offset
的 DES 密钥内容是否是奇偶校验的 (parity-adjusted)。如果给定的 DES 密钥内容是奇偶校验的,则返回 true,否则返回 false。
③public static boolean isWeak(byte[] key,int offset) throws InvalidKeyException 确定给定的 DES 密钥内容是否是全弱或者半弱的。
测试示例如下:
package com.home;
import javax.crypto.spec.DESKeySpec;
public class TestDESKeySpec {
private DESKeySpec keySpec1;// DESKeySpec实例1
private DESKeySpec keySpec2;// DESKeySpec实例2
private byte[] DESkey;// 设置密钥
public TestDESKeySpec() {
printDESKEYLEN();
try {
this.DESkey = "abcdefghijklmn".getBytes();
keySpec1 = new DESKeySpec(DESkey);
keySpec2 = new DESKeySpec(DESkey, 3);
printKey(keySpec1);
printKey(keySpec2);
// 确定给定的 DES密钥内容是否是奇偶校验的
System.out.println(DESKeySpec.isParityAdjusted(DESkey, 3));
// 确定给定的 DES密钥内容是否是全弱或者半弱的
System.out.println(DESKeySpec.isWeak(DESkey, 3));
} catch (Exception e) {
}
}
public static void main(String[] args) {
new TestDESKeySpec();
}
/**
* 打印以字节为单位的 DES密钥长度的常量的值
*/
private void printDESKEYLEN() {
System.out.println("以字节为单位的 DES密钥长度的常量:" + DESKeySpec.DES_KEY_LEN);
}
/**
* 打印keySpec的key
*
* @param keySpec
*/
private void printKey(DESKeySpec keySpec) {
String keyStr = new String(keySpec.getKey());
System.out.println(keySpec + "的key:" + keyStr);
}
}