前言: 最近遇到了一个问题,那就是需要搬移一个net项目的DESKeySpec加密的方法,这个也是找了很多的博客,踩坑很多次才实现,现在记录一下,提供给需要的朋友; 具体的实现源码:
public static String DesEncrypt(String jobNum,String keys)
{
try {
byte[] key = keys.getBytes();
// 初始化向量
IvParameterSpec iv = new IvParameterSpec(key);
DESKeySpec desKey = new DESKeySpec(key);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
// 现在,获取数据并加密
// 正式执行加密操作
byte[] tt=jobNum.getBytes(StandardCharsets.UTF_8);
byte[] tq= cipher.doFinal(tt);
return parseByte2HexStr(tq);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
/**
* 将二进制转换成16进制
*
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
public static byte[] convertHexString(String ss)
{
byte digest[] = new byte[ss.length() / 2];
for(int i = 0; i < digest.length; i++)
{
String byteString = ss.substring(2 * i, 2 * i + 2);
int byteValue = Integer.parseInt(byteString, 16);
digest[i] = (byte)byteValue;
}
return digest;
}
运行的效果:
参考官方网站:DESKeySpec (Java Platform SE 6)
DES_KEY_LEN
定义以字节为单位的 DES 密钥长度的常量。
static int
DES_KEY_LEN
定义以字节为单位的 DES 密钥长度的常量。
构造方法摘要
DESKeySpec(byte[] key)
创建一个 DESKeySpec 对象,使用 key
中的前 8 个字节作为 DES 密钥的密钥内容。DESKeySpec(byte[] key, int offset)
创建一个 DESKeySpec 对象,使用 key
中始于且包含 offset
的前 8 个字节作为 DES-EDE 密钥的密钥内容。
方法摘要
byte[]
getKey()
返回 DES 密钥内容。static boolean
isParityAdjusted(byte[] key, int offset)
确定给定的始于且包含 offset
的 DES 密钥内容是否是奇偶校验的 (parity-adjusted)。static boolean
isWeak(byte[] key, int offset)
确定给定的 DES 密钥内容是否是全弱或者半弱的。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
字段详细信息 DES_KEY_LEN
public static final int DES_KEY_LEN
定义以字节为单位的 DES 密钥长度的常量。
另请参见:
常量字段值
构造方法详细信息 DESKeySpecpublic DESKeySpec(byte[] key) throws InvalidKeyException
创建一个 DESKeySpec 对象,使用 key
中的前 8 个字节作为 DES 密钥的密钥内容。
组成 DES 密钥的字节在 key[0]
和 key[7]
范围内(包含两者)
参数:
key
- 具有 DES 密钥内容的缓冲区。复制该缓冲区的前 8 个字节来防止后续修改。
抛出:
NullPointerException
- 如果给定的密钥内容为 null
InvalidKeyException
- 如果给定的密钥内容短于 8 个字节。
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 密钥内容从此处开始。
抛出:
NullPointerException
- 如果给定的密钥内容为 null
InvalidKeyException
- 如果给定的始于且包含 offset
的密钥内容短于 8 个字节。
public byte[] getKey()
返回 DES 密钥内容。
返回:
返回 DES 密钥内容。每一次调用此方法都返回一个新数组。
isParityAdjustedpublic static boolean isParityAdjusted(byte[] key, int offset) throws InvalidKeyException
确定给定的始于且包含 offset
的 DES 密钥内容是否是奇偶校验的 (parity-adjusted)。
参数:
key
- 具有 DES 密钥内容的缓冲区。
offset
- key
中的偏移量,DES 密钥内容从此处开始。
返回:
如果给定的 DES 密钥内容是奇偶校验的,则返回 true,否则返回 false。
抛出:
InvalidKeyException
- 如果给定的密钥内容为 null
,或者始于且包含 offset
的密钥内容短于 8 个字节。
public static boolean isWeak(byte[] key, int offset) throws InvalidKeyException
确定给定的 DES 密钥内容是否是全弱或者半弱的。
参数:
key
- 具有 DES 密钥内容的缓冲区。
offset
- key
中的偏移量,DES 密钥内容从此处开始。
返回:
如果给定的 DES 密钥内容是全弱或者半弱的,则返回 true,否则返回 false。
抛出:
InvalidKeyException
- 如果给定的密钥内容为 null
,或者始于且包含 offset
的密钥内容短于 8 个字节。