package com.suning.hrqz.utils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Base64Utils;
//import java.util.Base64;
//import org.apache.commons.net.util.Base64;
public class DES3 {
    public static void main(String[] args) throws UnsupportedEncodingException,
            NoSuchAlgorithmException {
        String keyStr = "HRDS20170810";
        System.out.println("密钥明文:" + keyStr);
        byte keys[] = keyStr.getBytes("UTF-8");
        System.out.println("UTF-8十六进制:" + bytes2hex(keys));
        String keyBase64 = Base64Utils.encodeToString(keys);
        System.out.println("Base64密钥:" + keyBase64);
        System.out.println("Base64密钥还原:"
                + new String(Base64Utils.decodeFromString(keyBase64), "UTF-8")
                + "\n");
        String strText = "1";
        System.out.println("待加密的串:" + strText);
        String text1 = DES3.encryptProperty(strText, keyBase64);
        System.out.println("Base64密文:" + text1);
        String text2 = DES3.decryptProperty(text1, keyBase64);
        System.out.println("解密出的串:" + text2);
        // ////加密指纹
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update((strText + keyStr).getBytes("UTF-8"));
        System.out.println("MD5加密指纹:" + bytes2hex(md5.digest()));
    }
    private DES3() {
    }
    public static String encryptProperty(String clearText, String keyBase64) {
        if(StringUtils.isBlank(clearText)){
            return "";
        }
        byte[] key = Base64Utils.decodeFromString(keyBase64);
        return DES3.performDESedeCoder(clearText, key, true);
    }
    public static String decryptProperty(String cipherText, String keyBase64) {
        byte[] key = Base64Utils.decodeFromString(keyBase64);
        return DES3.performDESedeCoder(cipherText, key, false);
    }
    public static String performDESedeCoder(String inputValue, byte[] key,
            boolean encrypt) {
        byte[] k = key;
        byte keyByteArray[];
        if (k.length < 24) {
            keyByteArray = new byte[24];
            System.arraycopy(k, 0, keyByteArray, 0, k.length);
            for (int i = k.length; i < 24; i++) {
                keyByteArray[i] = 48;// 不足24字节时,补0
            }
            k = keyByteArray;
        }
        String KEY_ALGORITHM = "DESede";
        String CIPHER_ALGORITHM = "DESede/CBC/PKCS5Padding";
        byte[] data = null;
        try {
            DESedeKeySpec dks = new DESedeKeySpec(k);
            SecretKeyFactory keyFactory = SecretKeyFactory
                    .getInstance(KEY_ALGORITHM);
            SecretKey secretKey = keyFactory.generateSecret(dks);
            IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            byte[] input;
            if (encrypt) {
                cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
                input = inputValue.getBytes("UTF-8");
            } else {
                cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
                input = Base64Utils.decodeFromString(inputValue);
            }
            data = cipher.doFinal(input);
        } catch (Exception e) {
            throw new HRQZRuntimeException(e);
        }
        String rtnValue;
        if (data == null) {
            rtnValue = inputValue;
        } else {
            if (encrypt) {
                rtnValue = Base64Utils.encodeToString(data);
            } else {
                try {
                    rtnValue = new String(data, "UTF-8");
                } catch (UnsupportedEncodingException e) {
                    throw new HRQZRuntimeException(e);
                }
            }
        }
        return rtnValue;
    }
    public static String bytes2hex(byte[] bytes) {
        final String HEX = "0123456789ABCDEF";
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) {
            // 取出这个字节的高4位,然后与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
            sb.append(HEX.charAt((b >> 4) & 0x0f));
            // 取出这个字节的低位,与0x0f与运算,得到一个0-15之间的数据,通过HEX.charAt(0-15)即为16进制数
            sb.append(HEX.charAt(b & 0x0f));
        }
        return sb.toString();
    }

}

3DES 加、解密的更多相关文章

  1. 3DES 加解密

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Comm ...

  2. PHP版3DES加解密类

    <?php /** * * PHP版3DES加解密类 * * 可与java的3DES(DESede)加密方式兼容 * * @Author:蓝凤(ilanfeng.com) * * @versio ...

  3. 3DES加解密【示例】

    代码 /**  * 3DES加解密  */ public class DESedeUtils {     private static final String ALGORITHM_MD5 = &qu ...

  4. 3DES加解密 C语言

    3DES(或称为Triple DES),它相当于是对每个数据块应用三次DES加密算法.3*8字节密钥. 设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代 ...

  5. java 与 c# 3des 加解密

    java 与 c# 3des 加解密   主要差异如下: 1.  对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...

  6. 3DES加解密类

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace GT.C ...

  7. PHP和.NET通用的加密解密函数类,均使用3DES加解密 .

    以下为php代码 <PRE class=PHP name="code"> </PRE><PRE class=PHP name="code&q ...

  8. 3des加解密算法

    编号:1003时间:2016年4月1日09:51:11功能:openssl_3des加解密算法http://blog.csdn.net/alonesword/article/details/17385 ...

  9. 3DES 加解密,对长度不限制

    #region 3DES /// <summary> /// 3DES加密 /// </summary> /// <param name="strString& ...

  10. 3Des加解密 C#--->Java

    Java的Byte范围为-128至127,c#的Byte范围是0-255.核心是确定Mode和Padding,关于这两个的意思可以搜索3DES算法相关文章. C#采用CBC Mode,PKCS7 Pa ...

随机推荐

  1. setTimeout/setInterval,属性、连续动画、倒计时的分析

    setTimeout.setInterval环境应用和使用场景 说明:setTimeout属于超时调用, setInterval 属于间隔调用 1,setTimeout超时的使用介绍: var set ...

  2. sublime text3 中 python3编译出现中文乱码解决方法

    转 https://blog.csdn.net/Bin_bin_bingo/article/details/80531582 一.乱码现象 利用sublime自带编译快捷方式ctrl+B会出现中文乱码 ...

  3. hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】

    题目链接:https://vjudge.net/contest/84620#problem/K 题目大意:一个人从起点走到终点,问他是否能够在规定的时间走到,在走向终点的路线上,可能会有一些障碍门,他 ...

  4. 001.Ceph简介概述

    一 Ceph简介 Red Hat Ceph是一个分布式的数据对象存储,系统设计旨在性能.可靠性和可扩展性上能够提供优秀的存储服务.分布式对象存储是存储的未来,因为它们适应非结构化数据,并且客户端可以同 ...

  5. 深度学习(TensorFlow)环境搭建:(三)Ubuntu16.04+CUDA8.0+cuDNN7+Anaconda4.4+Python3.6+TensorFlow1.3

    紧接着上一篇的文章<深度学习(TensorFlow)环境搭建:(二)Ubuntu16.04+1080Ti显卡驱动>,这篇文章,主要讲解如何安装CUDA+CUDNN,不过前提是我们是已经把N ...

  6. js小函数工具

    突然想到建一片文章关于自己所学到的一些小函数,今后需要的时候可以直接当工具使用. 1.获取当前时间小程序. function showTime(){ var show_day=new Array('星 ...

  7. SpringBoot拦截器

    在实际开发中,总存在着这样的场景,比如拦截请求的ip地址,或者在所有的请求都返回相同的数据,如果每一个方法都写出相同数据固然可以实现,但是随着项目的变大,重复的代码会越来越多,所以在这种情况我们可以用 ...

  8. 路由网关---zuul

    Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架.Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门. 在微服务盛行的时代,客户端与系统之 ...

  9. 如何在ElementUI中的Table控件中使用拼音进行排序

    本人使用版本是1.4.7 在这个版本中对应全是String的column进行排序并不是按照拼音的方式排列的. 这里我贴一下源代码就可以看出是为什么了: export const orderBy = f ...

  10. [tem]最长上升子序列

    Longest Increasing Subsequence(LIS) 一个美丽的名字 非常经典的线性结构dp [朴素]:O(n^2) d(i)=max{0,d(j) :j<i&& ...