Java DES 使用方法

3,260 阅读3分钟
作者:玄夜 时间:2018-8-31

前言

算法,永不过时!

· 简介

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来(百度百科抄的)。

· 常用加密模式

ECB:电子密本模式

CBC:密文分组链接模式

CTR:计算器模式

CFB:加密反馈模式

OFB:输出反馈模式

· 填充方式

我看了很多的文章,但是很多都没有详细写上填充方式啊、偏移量什么的,只是简单的将代码贴出来,很容易看得稀里糊涂的,一时心血来潮,就自己也来整理一份了。

NoPadding:不填充

PKCS5Padding:缺几个字节就补充几个字节的几;

PKCS7Padding:缺几个字节就补几个字节的0;

ISO10126Padding:填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据;

java当中支持NoPadding、PKCS5Padding(默认)、ISO10126Padding;

· 偏移量

概念就不多解释了,在java的IvParameterSpec中,偏移量必须是8位的,否则直接报错

· 干货

这里重点讲下CBC模式,其他的就不一一讲了,自己可以换下参数:

1、第一步,将数据按照8个字节一组进行分组,A1A2...An,分组不是8的整数倍那就要用到数据填充了;

2、第一组数据A1与向量I异或后的结果进行DES加密得到第一组密文B1(向量I,也叫偏移量,ECB模式是没有的;如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,但CBC则不会);

3、第二组数据A2与第一组的加密结果B1异或以后的结果进行DES加密,得到第二组密文B2,如此类推,把数据串起来最后得到的B1B2B3......Bn就是加密结果。

· 工具类

public class DES {
    // 对称加密,这里不用在意为什么写了两行,都是一样的,
    private static String encryptKey = "6c12b11d";
    private static String decryptKey = "6c12b11d";

    // 向量/偏移量
    private static String ivStr = "166290ac";
    private static byte[] iv = ivStr.getBytes();


    //加密
    public static String encryptDES(String encryptString) throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(encryptString.getBytes());

        return Base64.encode(encryptedData);
    }


    //解密
    public static String decryptDES(String decryptString) throws Exception {
        byte[] byteMi = new Base64().decode(decryptString);
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
        byte decryptedData[] = cipher.doFinal(byteMi);

        return new String(decryptedData);
    }
}

· 执行代码

        String text = "中华人民共和国万岁!!!";
        String result1 = DES.encryptDES(text);
        String result2 = DES.decryptDES(result1);
        System.out.println(result1);
        System.out.println(result2);

· 运行结果

粉丝QQ群:557247785

炮友们有问题,请留言 感谢!