3Des加密

Java实现3DES加密解密(DESede/ECB/PKCS5Padding使用) 阅读详情
AI摘要

本文深入探讨3DES加密算法,对比单向与双向加密,详细解析3DES加密原理及实现过程,展示如何通过本地唯一密钥确保数据安全性。

       使用3Des加密算法前,我们需要了解一下当前主流的加密模式:单向加密和双向加密,两者最大的区别在于加密的密文是否具有可逆性。

       单向加密:将需要加密的数据进行加密,并且密文不可进行解密,像我们常用的加密算法MD5就属于这种。

       双向加密:和单向加密不同的是可以通过某些方式进行加解密的操作,其中分为对称加密和非对称加密。

               对称加密:指数据使用者必须拥有相同的密钥才可以进行加密解密,就像彼此约定的一串暗号,本文介绍的3Des加密就属于这种。

               非对称加密:通过一组包含公钥和私钥的密码来加密解密,用公钥加密,私钥解密,首推的就是RSA加密

---------------------------------------------------------------------------------------------------------------------------------------

         3Des加密算法,由于可以逆推原文,所以主要通过本地的唯一密钥来保证数据的安全性,我这边通过生成随机的256位加密字符串存储在本地,代码读取时将其通过md5加密成32位的字符串(由于本地有原始密钥,不必担心md5加密不可逆),最后以这32位加密字符串作为密钥进行加解密的操作。

  

package com.youfuli.util;


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

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.UUID;

/**
 * Created by lixiaotian on 2018/12/25.
 */
public class Des3Util {

	private static final String IV = "1234567-";

	/**
	 * DESCBC加密
	 *
	 * @param src 数据源
	 * @param key 密钥,长度必须是8的倍数
	 * @return 返回加密后的数据
	 * @throws Exception
	 */
	public String encryptDESCBC(final String src, final String key) throws Exception {

		// --生成key,同时制定是des还是DESede,两者的key长度要求不同
		final DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
		final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		final SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

		// --加密向量
		final IvParameterSpec iv = new IvParameterSpec(IV.getBytes("UTF-8"));

		// --通过Chipher执行加密得到的是一个byte的数组,Cipher.getInstance("DES")就是采用ECB模式,cipher.init(Cipher.ENCRYPT_MODE,
		// secretKey)就可以了.
		final Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
		final byte[] b = cipher.doFinal(src.getBytes("UTF-8"));

		// --通过base64,将加密数组转换成字符串
		final BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(b);
	}

	/**
	 * DESCBC解密
	 *
	 * @param src 数据源
	 * @param key 密钥,长度必须是8的倍数
	 * @return 返回解密后的原始数据
	 * @throws Exception
	 */
	public String decryptDESCBC(final String src, final String key) throws Exception {
		// --通过base64,将字符串转成byte数组
		final BASE64Decoder decoder = new BASE64Decoder();
		final byte[] bytesrc = decoder.decodeBuffer(src);

		// --解密的key
		final DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
		final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		final SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

		// --向量
		final IvParameterSpec iv = new IvParameterSpec(IV.getBytes("UTF-8"));

		// --Chipher对象解密Cipher.getInstance("DES")就是采用ECB模式,cipher.init(Cipher.DECRYPT_MODE,
		// secretKey)就可以了.
		final Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
		final byte[] retByte = cipher.doFinal(bytesrc);

		return new String(retByte);

	}

	// 3DESECB加密,key必须是长度大于等于 3*8 = 24 位哈
	public static String encryptThreeDESECB(final String src, final String key) throws Exception {
		final DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
		final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
		final SecretKey securekey = keyFactory.generateSecret(dks);

		final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, securekey);
		final byte[] b = cipher.doFinal(src.getBytes());

		final BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(b).replaceAll("\r", "").replaceAll("\n", "");

	}

	// 3DESECB解密,key必须是长度大于等于 3*8 = 24 位哈
	public static String decryptThreeDESECB(final String src, final String key) throws Exception {
		// --通过base64,将字符串转成byte数组
		final BASE64Decoder decoder = new BASE64Decoder();
		final byte[] bytesrc = decoder.decodeBuffer(src);
		// --解密的key
		final DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
		final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
		final SecretKey securekey = keyFactory.generateSecret(dks);

		// --Chipher对象解密
		final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
		cipher.init(Cipher.DECRYPT_MODE, securekey);
		final byte[] retByte = cipher.doFinal(bytesrc);

		return new String(retByte);
	}
}

       此处提供的代码中,展现了des加解密和3des加解密的相应的方法。des和3Des加密算法的区别在于des加密算法的实际密文长度为56位,导致加密长度不足,才会出现3Des加密算法来进行弥补的,通过执行3次DES来达到增加密钥长度和安全的目的。

        这边我提供一个测试类,用于测试生成本地唯一密钥文件和md5加密本地密钥文件,然后采用3Des对需要加解密的数据进行加解密的操作。

        

public static void main(String[] args) throws Exception {
		String str2 = "";
		StringBuilder result = new StringBuilder();
		File newfile = new File("D:/decrypt");
		if (!newfile.exists()) {
			newfile.mkdirs();
			File file = new File("D:/decrypt"+"/decrypt.txt");
			if(!file.exists()) {
				file.createNewFile();
			}
			for (int i=0;i<8;i++) {
				UUID uuid = UUID.randomUUID();
	            String str = uuid.toString();
	            String str1 = str.substring(0, 8) + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) + str.substring(24);
	            str2 = str2+str1;
			}
			FileOutputStream fileOutputStream = null;
			fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(str2.getBytes("UTF-8"));
            fileOutputStream.close();
		}
		BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream("D:/decrypt/decrypt.txt"), "UTF-8"));

		String lineTxt = null;
		while ((lineTxt = bfr.readLine()) != null) {
			result.append(lineTxt).append("\n");
		}
		bfr.close();
		str2 = result.toString();
		System.out.println(str2);
		String md5Key = md5.getMD5Str(str2);
		System.out.println("密钥:"+md5Key);
		String keys = "654321";
		Des3Util des3 = new Des3Util();
		String txt = des3.encryptThreeDESECB(keys, md5Key);
		System.out.println("加密数据:"+txt);
		String decy = des3.decryptThreeDESECB(txt,md5Key);
		System.out.println("解密数据:"+decy);
	}

     可以看出,我本地通过uuid循环八次随机生成密钥文件,然后对其进行md5,最后调用相应的方法进行加解密的操作,最后对需要加密的数据“654321”的加解密的操作结果如下:

  

第一行:打印出本地长度为256位的原始密钥

第二行:打印出使用md5加密后的密钥

第三行:对654321进行加密后的加密数据

第四行:对加密数据preJaIoIzLw=进行解密,最后还原为明文654321

---------------------------------------------------------------------------------------------------------------------------------------

      此次采用3Des加密算法,在于把本地配置文件中的密码配置进行加密化操作,将配置文件中的密码加密保存在数据库中,然后再读取时配置在缓存中。

package com.youfuli.util;

import com.youfuli.dao.FlxThirdAccountInfoMapper;
import com.youfuli.entity.FlxThirdAccountInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;

import java.io.*;
import java.util.*;

/**
 * Created by lixiaotian on 2018/12/25.
 */
public class ThirdAccountMap {

    private static Logger logger = LoggerFactory.getLogger(ThirdAccountMap.class);

    //账户map
    private static Map<String, String> accMap;

    static FlxThirdAccountInfoMapper thirdAccountInfoMapper = SpringUtil.getBean(FlxThirdAccountInfoMapper.class);

    static {
        try {
            List<FlxThirdAccountInfo> thirdAccountInfos = thirdAccountInfoMapper.findAccount();
            if (CollectionUtils.isEmpty(thirdAccountInfos)) {
                logger.info("数据库还未导入加密密码");
            }
            Properties prop = PropertiesUtil.getInstance();
            String decryptUrl = prop.getProperty("decrypt.url");
            StringBuilder result = new StringBuilder();
            File newfile = new File(decryptUrl);
            String txtFile = decryptUrl + "/decrypt.txt";
            File file = new File(txtFile);
            //文件不存在的情况
            if (!file.exists()) {
                if (!newfile.exists()) {
                    newfile.mkdirs();
                }
                file.createNewFile();
                String str2 = "";
                for (int i = 0; i < 8; i++) {
                    UUID uuid = UUID.randomUUID();
                    String str = uuid.toString();
                    String str1 = str.substring(0, 8) + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) + str.substring(24);
                    str2 = str2 + str1;
                }
                FileOutputStream fileOutputStream = null;
                fileOutputStream = new FileOutputStream(file);
                fileOutputStream.write(str2.getBytes("UTF-8"));
                fileOutputStream.close();
            }
            BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(txtFile)), "UTF-8"));
            String lineTxt = null;
            while ((lineTxt = bfr.readLine()) != null) {
                result.append(lineTxt).append("\n");
            }
            bfr.close();
            String str = md5.getMD5Str(result.toString());
            accMap = new HashMap<>();
            for (int i = 0; i < thirdAccountInfos.size(); i++) {
                String keys = thirdAccountInfos.get(i).getAccountKey();
                String values = thirdAccountInfos.get(i).getAccountValue();
                if ("1".equals(thirdAccountInfos.get(i).getIsEncrypt())) {
                    accMap.put(keys, Des3Util.decryptThreeDESECB(values, str));
                } else {
                    accMap.put(keys, values);
                }


            }
            logger.info("数据库解密密码完成");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 根据账户key进行查询
     *
     * @param accountKey
     * @return
     */
    public static String queryThirdKey(String accountKey) {
        if (accMap == null) {
            logger.error("数据库加密信息未加载");
            return null;
        }
        return accMap.get(accountKey);
    }
}

通过数据库中的key匹配key即可。

appKey = ThirdAccountMap.queryThirdKey("appKey");

其中还对文件路径下的文件做了处理,如果不存在即进行新建处理,个人觉得还有优化的空间。一起加油哦。

3DES数据加密算法 3DES数据加密算法是一种可逆的对称加密算法,也称三重数据加密算法(英语:Triple Data Encryption Algorithm,缩写为TDEA,Triple DEA),或称3DES(Triple DES),它是一种为了替代原先DES而建立的数据加密标准。 阅读详情

相关推荐

3DES加密算法原理及实现

目录 引语 加密 加密算法公式 为什么采用加密-解密-加密的形式 解密 代码实现 注意:3DES是3重DES加解密算法,具体原理同DES,不在赘述。 引语 DES算法是全网公开的,其安全性是依靠秘钥的,但是随着计算机算力的增长,56位的秘钥容易受到穷举攻击。因此,3DES作为替换升级的方案应运而生。 加密 3DES是对称加密的一种,是DES向AES过渡的加密算法。它使用三个秘钥的三重DES加密方法,该算法执行三次DES算法,其加密的过程是加密-解密-加密。 3DES加密流程 .

u012391423的博客 9313

3DES在线加密工具

3DES(Triple Data Encryption Standard,三重数据加密标准)是一种基于DES(Data Encryption Standard,数据加密标准)的对称密钥块加密算法。3DES是对原始DES算法的一种改进,旨在提供更强的安全性。一些开发还经常需要用到3DES进行加解密,为了方便进行验证测试,可以使用在线工具。

迷失蒲公英 1480

3DES加密解密

 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样: 3DES加密过程为:C

1万+

3DES 加密解密

C# 3DES加密解密

lln93988的博客 425

java 3DES加密解密

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。 下面使用ja

yqichang的专栏 6282

3DES加密算法

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法 3DES(即Tr...

knight20160302的博客 3088

3DES加密算法原理

一、3DES加密算法简析: 3DES,也称为 3DESede 或 TripleDES,是三重数据加密算法,相当于是对每个数据库应用三次DES的对称加密算法。 由于DES密码长度容易被暴力破解,所以3DES算法通过对DES算法进行改进,增加DES的密钥长度来避免类似的攻击,针对每个数据块进行三次DES加密;因此,3DES加密算法并非什么新的加密算法,是DES的一个更安全的变形,它以DES为基本模块,通过组合分组方法设计出分组加密算法。。 3DES是DES向AES过渡的加密算法,它使用2个或者3个56位的密钥对

aaa33_3的博客 1万+

3DES加密解密工具类

3DES加密解密的全工具类,快速帮助新人进行3Des加密解密

3DES 加密

今天介绍下对称加密的3DES加密。 3des加密是比较安全的对称加密算法,是3层des加密后的算法。 双方约定好相同的key,以及偏移量iv,加密模式,填充,然后进行加解密。 只有4个变量都相同才能加解密一致,所以安全上来说是比较安全的。 1.加密模式包含: EBC、CBC、CTR、OFB、CFB 2.填充包含: pcks5padding、pcks7padding 、zeropa...

BingHongChaZuoAn的专栏 1510

3DES加密解密工具

对数据进行3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密

DES/3DES加密解密工具

对数据进行单DES或者3DES加密或者解密,如果密码长度为8字节则为DES加密或者解密

3DES加密

最近需要对外对接部分接口,用到了DES3加密,便顺手整理一下逻辑和python实现。 DES 对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 3DES 3DES(即Triple DES)是DES向AES过渡的加密算...

1437

Win10右键新建菜单丢了记事本?别慌!5分钟教你用注册表找回来(附权限设置避坑指南)

本文详细指导如何通过注册表编辑器恢复Win10右键新建菜单中丢失的记事本选项,包括重建键值结构、配置ShellNew项及设置权限等关键步骤。特别提供权限避坑指南,确保修改持久有效,帮助用户快速解决这一常见但困扰的问题。

weixin_31714129的博客 857

PHP进行3des加密

封装加密解密类 <?php namespace app\api\controller; use think\Controller; header("Content-Type:text/html; charset=utf-8"); class Encrypt extends Controller{ var $key='012345678901234567890123456789...

chengxiadenghuo的博客 1546

Reactor 响应式编程(第一篇:Reactor核心)

响应式:响应式编程: 全异步、消息、事件回调默认还是用当前线程,生成整个流、发布流、流操作.log();//只要不指定线程池,默认发布者用的线程就是订阅者的线程;

moments的博客 1572

图文带你理解什么是Few-shot Learning

Few-shot Learning(少样本学习)是Meta Learning(元学习)中的一个实例1,所以在了解什么是Few-shot Learning之前有必要对Meta Learning有一个简单的认识。不过在了解什么是Meta Learning之前还是要了解一下什么是Meta。因此,阅读本文后你将对如下知识有一个初步的了解。 What is Meta What is Meta Learning What is Few-shot Learning 1. What is Meta? meta就是描述

Pr4da的博客 1万+

Java中3DES加密

在java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:jce.jarsecurity/US_export_policy.jarsecurity/local_policy.jarext/sunjce_provider.jar Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环

wawa_sz的专栏 1753

数据库实验报告--MySQL

数据库完整版报告--MySQL 包括数据库创建、表的创建、视图以及授权和触发器的创建等内容,全是精华!看完点赞加收藏O(∩_∩)O~。

Mortalz7 4924

php openssl 3des,使用openssl进行3des加密

this.p={ m:2,b:2,loftPermalink:'',id:'fks_085071084084086075080087082095080081088066087082082065',blogTitle:'使用openssl进行3des加密',blogAbstract:'由于要在linux下进行3des-ecb加密,在网上找了一些源码,很多根本不能运行,能运行的也都无法直接使用,不是...

weixin_42569429的博客 887

IC面试常考题 Verilog三分频电路设计(占空比50%,三分之一,三分之二)

实现三分频电路最简单的是: 利用计数器实现。 时序图分析(本人比较懒,平常科研忙,所以直接手画时序图了,懒得用软件画了): 直接上图分析:利用计数器每隔三个周期信号翻转一次,同时在不同的计数下翻转得到的同步信号 clk_1和clk_2,再利用异或即可实现出一个不同占空比的三分频信号(同样的方法也可扩展到其他奇数分频设计中)。 例如占空比50%: module Div_three( input clk, input rst_n, output div_three ); reg

qq_41884662的博客 1万+

化工管道设计软件:CAESAR II二次开发_(6).API接口与函数库

自定义函数库是开发者根据特定需求编写的函数集合。这些函数可以扩展CAESAR II的功能,实现更复杂的管道设计任务。自定义函数库通常需要开发者具备一定的编程基础,能够理解和编写与CAESAR II接口兼容的代码。定义函数:在Python或其他编程语言中定义所需的函数。注册函数:将自定义函数注册到CAESAR II的函数库中。调用函数:在CAESAR II中调用自定义函数,实现特定功能。假设我们需要创建一个自定义函数库,用于批量修改管道节点的坐标。定义函数:在Python中定义一个函数,用于批量修改节点坐标。

kkchenjj的博客 1734

对称加密算法——3DES加密算法

3DES是对DES算法的改进,通过对数据进行三次DES加密来提高安全性。E表示DES加密D表示DES解密K1K2K3是三个不同的56位密钥。

2301_79455190的博客 2155

海康VisionMaster与西门子Smart 200进行S7通信

海康VisionMaster与西门子Smart 200进行S7通信

haier123888的博客 8180
上一篇: 微信支付-----申请退款和退款通知接收
下一篇: Redis数据类型
准时长大
博客等级 码龄10年 107粉丝 76原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值