首页
学习
活动
专区
圈层
工具
发布

【小工匠聊密码学】--对称加密--DES

1、DES算法概述

  DES对称加密,对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一对称加密算法。

2、DES算法特点

  密钥长度56位+8位校验位,生命周期短。

3、DES算法实现

3.1 DES的JDK实现

(1)工作模式 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128. (2) 填充模式 NoPadding、PKCS5Padding、ISO10126Padding (3) 代码实现

代码语言:javascript
复制
package lzf.cipher.jdk;
import java.nio.charset.Charset;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 * @author Java小工匠
 */
public class DesUtils {
    // 获取 DES Key
    public static byte[] getDesKey() {
        try {
            // 1、创建密钥生成器
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
            keyGenerator.init(56);
            // 2、产生密钥
            SecretKey secretKey = keyGenerator.generateKey();
            // 3、获取密钥
            byte[] key = secretKey.getEncoded();
            return key;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    // DES 解密
    public static byte[] encryptDes(byte[] data, byte[] key) {
        try {
            SecretKey secretKey = new SecretKeySpec(key, "DES");
            String type = "DES";
            // 加工作模式和填充方式
            // type= "DES/ECB/PKCS5Padding";
            Cipher cipher = Cipher.getInstance(type);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] rsData = cipher.doFinal(data);
            return rsData;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public static byte[] decryptDes(byte[] data, byte[] key) {
        try {
            SecretKey secretKey = new SecretKeySpec(key, "DES");
            String type = "DES";
            // 加工作模式和填充方式
            // type= "DES/ECB/PKCS5Padding";
            Cipher cipher = Cipher.getInstance(type);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] rsData = cipher.doFinal(data);
            return rsData;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    // 字节数组转16 进制
    public static String bytesToHexStr(byte[] bytes, boolean blow) {
        if (bytes == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            int v = b & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                sb.append("0");
            }
            sb.append(hv);
        }
        String rs = sb.toString();
        if (!blow) {
            rs = rs.toUpperCase();
        }
        return rs;
    }
    public static void main(String[] args) {
        byte[] data = "java小工匠".getBytes(Charset.forName("UTF-8"));
        byte[] key = getDesKey();
        System.out.println("DES KEY:" + bytesToHexStr(key, true));
        byte[] encryptData = encryptDes(data, key);
        System.out.println("encrypt data:" + bytesToHexStr(encryptData, true));
        byte[] decryptData = decryptDes(encryptData, key);
        System.out.println("decrypt data:" + new String(decryptData));
    }
}
下一篇
举报
领券