JAVA开发经验(二):常用工具类1.2-加解密-DES

摘要说明:

DES DES是对称性加密里面常见一种,全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。

Maven依赖:

无,使用jdk默认即可

java工具类:

DESUtil主要包括对字符串和字节数组进行对称加解密:

package com.tit.taf.encryption;

import java.security.Key;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import com.sun.org.apache.xml.internal.security.utils.Base64;

/**
 * 
 * @模块名:module_taf
 * @包名:com.tit.taf.encryption
 * @类名称: DESUtil
 * @类描述:【类描述】 DES是对称性加密里面常见一种,全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。
 * @版本:1.0
 * @创建人:cc
 * @创建时间:2018年7月27日下午3:47:46
 */
public class DESUtil {

    /**
     * 算法/模式/补码方式
     */
    public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";

    /**
     * 
     * @方法名:encode
     * @方法描述【方法功能描述】DES算法,加密
     * @param key data 待加密字符串
     * @param data 加密私钥,长度不能够小于8位
     * @param ivKey 使用CBC模式,需要一个向量iv,可增加加密算法的强度
     * @return 加密后的字节数组,一般结合Base64编码使用
     * @throws Exception
     * @修改描述【修改描述】
     * @版本:1.0
     * @创建人:cc
     * @创建时间:2018年7月27日 下午3:58:47
     * @修改人:cc
     * @修改时间:2018年7月27日 下午3:58:47
     */
    public static String encode(String key, String data, String ivKey) throws Exception {
        return encode(key, data.getBytes(), ivKey);
    }

    /**
     * 
     * @方法名:decodeValue
     * @方法描述【方法功能描述】 DES算法,解密base64编码的密文
     * @param key 解密私钥,长度不能够小于8位
     * @param data base64编码的密文
     * @param ivKey 使用CBC模式,需要一个向量iv,可增加加密算法的强度
     * @return 解密后的字符串
     * @throws Exception
     * @修改描述【修改描述】
     * @版本:1.0
     * @创建人:cc
     * @创建时间:2018年7月27日 下午4:04:07
     * @修改人:cc
     * @修改时间:2018年7月27日 下午4:04:07
     */
    public static String decodeValue(String key, String data, String ivKey) throws Exception {
        byte[] datas;
        String value = null;
        datas = decode(key, Base64.decode(data), ivKey);
        value = new String(datas, "UTF-8");
        if (value.equals("")) {
            throw new Exception();
        }
        return value;
    }

    /**
     * 
     * @方法名:encode
     * @方法描述【方法功能描述】 DES算法,加密
     * @param key 加密私钥,长度不能够小于8位
     * @param data 待加密字节数组
     * @param ivKey 使用CBC模式,需要一个向量iv,可增加加密算法的强度
     * @return 加密后的字节数组,一般结合Base64编码使用
     * @throws Exception
     * @修改描述【修改描述】
     * @版本:1.0
     * @创建人:cc
     * @创建时间:2018年7月27日 下午3:59:28
     * @修改人:cc
     * @修改时间:2018年7月27日 下午3:59:28
     */
    public static String encode(String key, byte[] data, String ivKey) throws Exception {
        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        // key的长度不能够小于8位字节
        Key secretKey = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
        IvParameterSpec iv = new IvParameterSpec(ivKey.getBytes());
        AlgorithmParameterSpec paramSpec = iv;
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
        byte[] bytes = cipher.doFinal(data);
        return Base64.encode(bytes);
    }

    /**
     * 
     * @方法名:decode
     * @方法描述【方法功能描述】 DES算法,解密
     * @param key 解密私钥,长度不能够小于8位
     * @param data 待解密字节数组
     * @param ivKey 使用CBC模式,需要一个向量iv,可增加加密算法的强度
     * @return 解密后的字节数组
     * @throws Exception
     * @修改描述【修改描述】
     * @版本:1.0
     * @创建人:cc
     * @创建时间:2018年7月27日 下午4:03:36
     * @修改人:cc
     * @修改时间:2018年7月27日 下午4:03:36
     */
    public static byte[] decode(String key, byte[] data, String ivKey) throws Exception {
        SecureRandom sr = new SecureRandom();
        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        // key的长度不能够小于8位字节
        Key secretKey = keyFactory.generateSecret(dks);
        Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
        IvParameterSpec iv = new IvParameterSpec(ivKey.getBytes());
        AlgorithmParameterSpec paramSpec = iv;
        cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception {
        System.out.println(DESUtil.encode("t1714201", "cc", "t1714201"));// A6vgfIhyyVc=
        System.out.println(DESUtil.decodeValue("t1714201", "A6vgfIhyyVc=", "t1714201"));// cc
    }
}

猜你喜欢

转载自blog.csdn.net/u010904188/article/details/82012123
今日推荐