JAVA安全:3DES

原创 2018年04月17日 18:30:45

1、安全加密算法

3DES,三重数据加密,且可以逆推的一种算法方案。

2、3DES加密算法的原理介绍

对称加密算法DES、3DES原理和实现方式:https://my.oschina.net/zchuanzhao/blog/525898

3、3DES加密过程

https://baike.baidu.com/item/3DES/6368161?fr=aladdin

4、3DES生成秘钥

这里特别要注意:K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。
一直以为秘钥长度设置为168或112就是生成的16进制秘钥字符串长度不是48(192位),其实结果就是192bit。
package test.des;

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.junit.Test;
/**
 * DES是非对称加密,加密和解密使用的密钥\初始化向量都要相同,否则当然解不了密
 *
 */
public class DESUtil {
	private static String default_key = "0462164c0ae6daa12f980e2ca2fb15c12a921eae3c119ee5";
	//算法密钥长度参数:3DES(112或168)
    private static int key_length = 168;
	private static byte[] gen_key = null;
	
	@Test
	public void testDES() {
		String preencryptData = "1234567890";
		try {
			System.out.println("preencryptData:" + preencryptData);
			byte[] encryptData = encrypt(hexStringToBytes(preencryptData), getKey());
			String encryptDataStr = fromByteToHex(encryptData);
			System.out.println("encryptData:" + encryptDataStr);
			byte[] decryptData = decrypt(encryptData, getKey());
			String decryptDataStr = fromByteToHex(decryptData);
			System.out.println("decryptDataStr:" + decryptDataStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	/**
	 * 生成秘钥
	 */
	public byte[] getKey() {
		if (null != gen_key && gen_key.length != 0) {
			System.out.println("gen_key:" + fromByteToHex(gen_key));
			return gen_key;
		}
		try {
			gen_key = generateKey();
		} catch (NoSuchAlgorithmException e) {
			gen_key = hexStringToBytes(default_key);
			e.printStackTrace();
		}
		System.out.println("gen_key:" + fromByteToHex(gen_key));
		return gen_key;
	}
	
    /**
     * DES 加密
     */
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception{
        SecretKey secretKey = new SecretKeySpec(key, "DESede");
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] resultBytes  = cipher.doFinal(data);
        return resultBytes ;
    }
    
    /**
     * DES 解密
     */
    public static byte[] decrypt(byte[] data, byte[] key) throws Exception{
        SecretKey secretKey = new SecretKeySpec(key, "DESede");
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] resultBytes  = cipher.doFinal(data);
        return resultBytes ;
    }
    
    private byte[] generateKey() throws NoSuchAlgorithmException {
    	KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede") ;
    	keyGenerator.init(key_length);
    	SecretKey secretKey = keyGenerator.generateKey();
    	return secretKey.getEncoded();
    }
    
	private byte[] hexStringToBytes(String hexString) {   
	    if (hexString == null || hexString.equals("")) {   
	        return null;   
	    }   
	    hexString = hexString.toUpperCase();   
	    int length = hexString.length() / 2;   
	    char[] hexChars = hexString.toCharArray();   
	    byte[] d = new byte[length];   
	    for (int i = 0; i < length; i++) {   
	        int pos = i * 2;   
	        d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));   
	    }   
	    return d;   
	}   
	
	private byte charToByte(char c) {   
	    return (byte) "0123456789ABCDEF".indexOf(c);   
	}  
	
	private String fromByteToHex(byte[] data){
        StringBuilder builder = new StringBuilder("");
        if(data == null || data.length <= 0){
            return null;
        }
        for(int i = 0; i<data.length;i++){
            int v = data[i] & 0xFF;
            String result = Integer.toHexString(v);
            if(result.length()<2){
                builder.append(0);
            }
            builder.append(result);
        }
        return builder.toString();
    }

}

测试结果:

preencryptData:1234567890
gen_key:0d9da72ada085719fd80670d31d3df9b7ada2c620849e5b5
encryptData:ea836cced09c9fd8
gen_key:0d9da72ada085719fd80670d31d3df9b7ada2c620849e5b5
decryptDataStr:1234567890

5、其他文章

https://www.cnblogs.com/wsss/p/6925090.html
https://blog.csdn.net/hwaphon/article/details/52190653
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingzi123456789/article/details/79978831

3DES 和 AES 加密算法的使用

3DES 介绍上篇文章已经介绍了 DES 算法的使用,并且也提到,在计算机计算速度特别快的今天,要破解 DES 加密过后的数据是完全有可能做到的,为什么呢?因为 DES 算法的密钥 也就64位,所有可...
  • Hwaphon
  • Hwaphon
  • 2016-08-12 12:36:14
  • 4745

Java 加解密技术系列之 3DES

序 上一篇文章讲的是对称加密算法 — — DES,这篇文章打算在 DES 的基础上,继续多讲一点,也就是 3 重 DES — — Triple DES。 背景 至于 3DES 为什么会...
  • happylee6688
  • happylee6688
  • 2015-03-19 14:23:19
  • 7247

Base64和3DES加密算法原理

这篇文章是对Base64和3DES算法以及他们如何在iphone平台上实现的一点总结。本文吸收了很多前人的资料和成果,在修正了其中的一些错误的基础上添加了自己的理解。在此向前人出色的工作表示感谢。本文...
  • chenglei9128
  • chenglei9128
  • 2016-01-29 16:02:19
  • 2519

JAVA 3DES加密解密工具类

package zmx.code.test; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.Sec...
  • zmx729618
  • zmx729618
  • 2016-11-01 12:28:26
  • 5396

基于java类库的3DES加密算法实现

别看3DES的代码很复杂,其实和DES代码一样,核心代码就那么几行加密部分的核心 Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding...
  • super_cui
  • super_cui
  • 2017-04-26 19:15:42
  • 623

JAVA 3DES加密解密

import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import j...
  • z69183787
  • z69183787
  • 2015-11-23 14:04:42
  • 2986

Java 3DES加密解密(Commons.Codec Base64)

字符串 DESede(3DES) 加密。ECB模式/使用PKCS7方式填充不足位,目前给的密钥是192位 。3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-...
  • softwave
  • softwave
  • 2017-08-09 11:09:10
  • 2622

3DES加密—java/OC

移动开发中遇到的最让人纠结的要属Java、Android和iPhone三个平台加解密不一致的问题。因为手机端后台通常是用JAVA开发的Web Service,Android和iPhone客户端调用同样...
  • pjk1129
  • pjk1129
  • 2016-01-11 17:47:26
  • 4201

Java与js完成des+3des加密 、解密

与移动端进行交换的时候经常遇到需要加密、解密的情况,最近在给移动端做接口,就研究了下加解密,把两种方式汇总一下: 1、des加密、解密 (1)des加解密工具类 package com.loan.fo...
  • dreamer_8399
  • dreamer_8399
  • 2017-07-12 16:49:34
  • 699

Java 3des加密算法ECB模式

  • 2017年11月10日 09:54
  • 9KB
  • 下载
收藏助手
不良信息举报
您举报文章:JAVA安全:3DES
举报原因:
原因补充:

(最多只允许输入30个字)