DES
2024年11月12日约 715 字大约 2 分钟
4.1 DES
DES 全称 Data Encryption Standard,是一种使用密钥加密的块算法。
密钥8个字节(DES使用56位的密钥和64位的明文块进行加密)。
DES采用16轮运算,每轮产生一个轮密匙参与到运算中。
虽然DES算法的分组大小是64位,但是由于DES算法的密钥长度只有56位,因此DES算法存在着弱点,容易受到暴力破解和差分攻击等攻击手段的威胁。
因此,在实际应用中,DES算法已经不再被广泛使用,而被更加安全的算法所取代,如AES算法等。
尽管如此,该加密算法还是运用非常普遍,是一种标准的加密算法,3DES 是 DES 的加强版本。
DES 加密算法出自 IBM 的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,
因为 DES 使用56位密钥(密钥长度越长越安全),以现代计算能力24小时内即可被破解。
虽然如此,在某些简单应用中,我们还是可以使用 DES 加密算法。
加密与解密代码样例
Java
加密
private static String desEncrypt(byte[] skey, String input) throws Exception {
// 实例化DES密钥材料, 使用 b 中的前8个字节作为DES密钥的内容
DESKeySpec dks = new DESKeySpec(skey);
// 实例化秘钥工厂
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
// 生成秘钥
SecretKey secretKey = secretKeyFactory.generateSecret(dks);
// 实例化
// Cipher cipher = Cipher.getInstance(secretKeyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 初始化。设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 执行
byte[] data = cipher.doFinal(input.getBytes());
String basee64Data = Base64.encodeBase64String(data);
System.out.println(basee64Data);
return basee64Data;
}
解密
private static String desDecrypt(byte[] skey, String encBase64Data) throws Exception {
byte[] encData = Base64.decodeBase64(encBase64Data);
// 实例化DES密钥材料, 使用 b 中的前8个字节作为DES密钥的内容
DESKeySpec dks = new DESKeySpec(skey);
// 实例化秘钥工厂
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
// 生成秘钥
SecretKey secretKey = secretKeyFactory.generateSecret(dks);
// 实例化
// Cipher cipher = Cipher.getInstance(secretKeyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 初始化。设置为加密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 执行
byte[] s = cipher.doFinal(encData);
String rs = new String(s);
System.out.println(rs);
return rs;
}
CryptoJS
加密
/**
* DES 加密
*
* @param data 加密的byte数据
* @param key 私钥的byte数据
* @returns {*}
*/
function desEncrypt(data, skey){
var key = CryptoJS.enc.Utf8.parse(skey);
var encrypted = CryptoJS.DES.encrypt(data, key, /* cfg */ {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7 // 包含 PKCS5Padding
});
return encrypted.ciphertext.toString();
}
解密
/**
* DES 解密
*/
function desDecrypt(encrypt_data, skey){
var key = CryptoJS.enc.Utf8.parse(skey);
var decrypted = CryptoJS.DES.decrypt(
{
ciphertext: CryptoJS.enc.Hex.parse(encrypt_data)
},
key,
/* cfg */ {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7 // 包含 PKCS5Padding
});
return decrypted.toString(CryptoJS.enc.Utf8)
}
注意
注意,密钥必须是8的倍数,否则会报 java.security.InvalidKeyException: Wrong key size。
DES 标准密钥就是56位,8个字符即8个字节,每个字节的最高位不用,即每个字节只用7位,8个字符正好是56位。