DES加密技术原理及其实现方式

DES(Data Encryption Standard),是一种流行于上世纪80年代的数据加密算法系列,其原始思想诞生于参照二战德国的恩尼格玛机。与传统密码大多是循环移位不同,恩尼格玛机在这个基础之上进行了扩散模糊。但本质原理基本相同。

传统的DES加密使用一个56位的密钥和8位的奇偶校验位,产生总共64位的分组大小,再利用Feistel技术将其分成两半,各自做应用循环计算,并将得到各自得到的结果进行异或运算,然后交换这两半,继续循环,直到最后一个循环不做交换为止。这种加密方式一共使用16次循环,可以进行异或,置换,代换,移位操作四种基本运算。

由于其安全问题,DES加密后来经过修改,扩展成了3DES(Triple DES,也被称为 DES ede——DES encrypt decrypt encrypt)加密技术,3DES最主要的提升在于将密钥升级为168位并三次使用3DES加密技术,这样做极大地提高了DES安全性,且如果三个56位的子元素均相同,则其兼容DES技术。

DES通常的破解方式是进行或穷举,重复尝试各种密钥直到它们验证通过为止,在计算机计算能力疲软的过去,这样的加密方式尚满足人们的需求,但随着计算系统能力的提高,破解也越来越容易,所以后来在DES的基础上,人们开发了新的加密方式——高级加密标准(AES Advanced Encryption Standard)。

产生过程大致清楚后,接下来看下面一段代码:

Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");

这段代码中,desede/CBC/PKCS5Padding等价于desede。
第一段为加密算法名称;第二段为分组加密模式,常用的有ECB和CBC等;第三段为分组的填充模式,需要加密的明文很多时候并不是64的倍数,所以经过加密之后需要对每一对不满足64位的分组进行填充,PKCS5Padding是最常用的填充方式,也是默认选项。

实现方式(解密):

public static String decryptString(String src) {
    try {
        // REQUEST_SECRETKEY 秘钥
        Key deskey = null;
        DESedeKeySpec spec = new DESedeKeySpec(REQUEST_SECRETKEY.getBytes());
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
        deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
        // REQUEST_IV 向量
        IvParameterSpec ips = new IvParameterSpec(REQUEST_IV.getBytes());

        cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
        byte[] decryptData = cipher.doFinal(hex2byte(src));
        return new String(decryptData, encoding);


    } catch (java.security.NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
        e2.printStackTrace();
    } catch (Exception e3) {
        e3.printStackTrace();
    }
    return null;

}

实现方式:(加密)

public static String encryptString(String src) {
    try {

        // REQUEST_SECRETKEY 秘钥
        Key deskey = null;
        DESedeKeySpec spec = new DESedeKeySpec(REQUEST_SECRETKEY.getBytes());
        SecretKeyFactory keyfactory = SecretKeyFactory
                .getInstance("desede");
        deskey = keyfactory.generateSecret(spec);

        Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
        // REQUEST_IV 向量
        IvParameterSpec ips = new IvParameterSpec(REQUEST_IV.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
        byte[] encryptData = cipher.doFinal(src.getBytes(encoding));
        return StringUtils.byte2hex(encryptData);

    } catch (java.security.NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
        e2.printStackTrace();
    } catch (Exception e3) {
        e3.printStackTrace();
    }
    return null;
}

以上代码为简单的3DES加密解密应用,开发者可以自定义IV和key实现效果。

你可能感兴趣的:(DES加密技术原理及其实现方式)