前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【小工匠聊密码学】--对称加密--DES

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

作者头像
Java小工匠
发布2018-08-10 11:53:17
2560
发布2018-08-10 11:53:17
举报
文章被收录于专栏:小工匠技术圈小工匠技术圈

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));
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小工匠技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、DES算法概述
  • 2、DES算法特点
  • 3、DES算法实现
    • 3.1 DES的JDK实现
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档