3DES加密算法原理

article/2025/9/16 16:36:42

一、3DES加密算法简析:

3DES,也称为 3DESede 或 TripleDES,是三重数据加密算法,相当于是对每个数据库应用三次DES的对称加密算法。

由于DES密码长度容易被暴力破解,所以3DES算法通过对DES算法进行改进,增加DES的密钥长度来避免类似的攻击,针对每个数据块进行三次DES加密;因此,3DES加密算法并非什么新的加密算法,是DES的一个更安全的变形,它以DES为基本模块,通过组合分组方法设计出分组加密算法。。

3DES是DES向AES过渡的加密算法,它使用2个或者3个56位的密钥对数据进行三次加密。相比DES,3DES因密钥长度变长,安全性有所提高,但其处理速度不高。因此又出现了AES加密算法,AES较于3DES速度更快、安全性更高。

二、3DES加密过程:

该算法的加解密过程分别是对明文/密文数据进行三次DES加密或解密,得到相应的密文或明文。

假设EK()和DK()分别表示DES的加密和解密函数,P表示明文,C表示密文,那么加解密的公式如下:

加密:C = EK3( DK2( EK1(P)) ),即对明文数据进行,加密 --> 解密 --> 加密的过程,最后得到密文数据;

解密:P = DK1( EK2( DK3(C)) ),即对密文数据进行,解密 --> 加密 --> 解密的过程,最后得到明文数据;

其中:K1表示3DES中第一个8字节密钥,K2表示第二个8字节密钥,K3表示第三个8字节密钥,K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位,即K1对应KL(左8字节),K2对应KR(右8字节),K3对应KL(左8字节)。
在这里插入图片描述

当三重密钥均相同时,前两步相互抵消,相当于仅实现了一次加密,因此可实现对普通DES加密算法的兼容。
在这里插入图片描述

由于DES加解密算法是每8个字节作为一个加解密数据块,因此在实现该算法时,需要对数据进行分块和补位(即最后不足8字节时,要补足8字节)。Java本身提供的API中NoPadding,Zeros填充和PKCS5Padding。假设我们要对9个字节长度的数据进行加密,则其对应的填充说明如下:

(1)NoPadding:API或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充\0或者空格,然后trim;

(2)ZerosPadding:无数据的字节全部被填充为0;

第一块:F0 F1 F2 F3 F4 F5 F6 F7

第二块:F8 0 0 0 0 0 0 0

(3)PKCS5Padding:每个被填充的字节都记录了被填充的长度;

①加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8。

②解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。

③加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。

(4)PKCS7Padding:

PKCS7Padding 的填充方式和PKCS5Padding 填充方式一样。只是加密块的字节数不同。PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。

三、3DES解密:

3DES解密过程,与加密过程相反,即逆序使用密钥。是以密钥3、密钥2、密钥1的顺序执行 解密->加密->解密。
在这里插入图片描述

四、Java使用3DES加密解密的流程:

在这里插入图片描述

①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象:

SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);

②根据算法实例化Cipher对象,它负责加密/解密:

Cipher c1 = Cipher.getInstance(Algorithm);

③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象:

c1.init(Cipher.ENCRYPT_MODE, deskey);

④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组:

c1.doFinal(src);

Java语言加密案例:

/*字符串 DESede(3DES) 加密*/
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;public class Des3 {private static final String Algorithm = "DESede"; // 定义 加密算法,可用DES,DESede,Blowfish// 加密函数// keybyte为加密密钥,长度为24字节// src为被加密的数据缓冲区(源)public static byte[] encryptMode(byte[] keybyte, byte[] src) {try {// 生成密钥SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);// 加密Cipher c1 = Cipher.getInstance(Algorithm);c1.init(Cipher.ENCRYPT_MODE, deskey);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (java.lang.Exception e3) {e3.printStackTrace();}return null;}// 解密函数// keybyte为加密密钥,长度为24字节// src为加密后的缓冲区public static byte[] decryptMode(byte[] keybyte, byte[] src) {try {// 生成密钥SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);// 解密Cipher c1 = Cipher.getInstance(Algorithm);c1.init(Cipher.DECRYPT_MODE, deskey);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (java.lang.Exception e3) {e3.printStackTrace();}return null;}// 转换成十六进制字符串public static String byte2hex(byte[] b) {String hs = "";String stmp = "";for (int n = 0; n < b.length; n++) {stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));if (stmp.length() == 1) {hs = hs + "0" + stmp;} else {hs = hs + stmp;}if (n < b.length - 1) {hs = hs + ":";}}return hs.toUpperCase();}public static void main(String[] args) {// 添加新安全算法,如果用JCE就要把它添加进去Security.addProvider(new com.sun.crypto.provider.SunJCE());final byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36, (byte) 0xE2 }; // 24字节的密钥String szSrc = "This is a 3DES test. 测试";System.out.println("加密前的字符串:" + szSrc);byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());System.out.println("加密后的字符串:" + new String(encoded));byte[] srcBytes = decryptMode(keyBytes, encoded);System.out.println("解密后的字符串:" + (new String(srcBytes)));}
}

http://chatgpt.dhexx.cn/article/S7vQaaR6.shtml

相关文章

简述3DES加密算法

之前我们聊了DES加密算法&#xff0c;在文章的最后我们提到了人们为了克服DES加密算法的不足&#xff0c;提出了三重DES&#xff0c;也就是3DES&#xff0c;今天我们就来简单了解一下它。 什么是3DES&#xff1f; 3DES&#xff0c;也称为3DESede或TripleDES&#xff0c;是三重数…

图解DES、3DES和AES加密算法

文章目录 一、DES1. 加密和解密2. DES的结构(Feistel网络) 二、3DES1. 3DES加密2. 3DES解密 三、AES1. AES最终候选算法和算法确定2. Rijndael2.1 什么是Rijndael2.2 Rijndael的加密和解密 3. AES密钥生成4. AES算法流程图 一、DES 1. 加密和解密 DES是一种将64bit的明文加密…

ArcGIS版本高级应用 数据归档(历史归档 存档数据)

QQ交流群&#xff1a;607330463 GIS开发技术最强交流群 未经允许 禁止转载 可以参考 目录 1地理数据库 (Geodatabase) 存档 2启用存档 3存档过程 4使用历史版本 5使用历史标记 6使用地理数据库历史查看器 7直接使用存档类 8架构更改和存档 9禁用存档 10存档情景…

文件归档功能

在帮助大家运维EDI平台的这几年中&#xff0c;常常有些客户反馈为什么之前发送的数据页面上都没有了呢&#xff1f;我想查询下之前的数据是否有成功发送给我们的客户应该怎么确认呢&#xff1f;业务数据量太大&#xff0c;文件占用磁盘空间太多&#xff0c;我如何快速地确认一些…

如何创建归档?

首先这里我们先了解两个概念归档和压缩&#xff0c;归档就相当于将文件批量打包在一块&#xff0c;便于之后工作查找文件的位置&#xff0c;但是总体文件的大小是不变的&#xff0c;例如我们将10个不通路径下且每个大小都是10M的文件打包在一块&#xff0c;那么归档后的大小就是…

大数据归档-冷热数据分离

1. 什么是TokuDB&#xff1f; TokuDB 是一个支持事务的“新”引擎&#xff0c;有着出色的数据压缩功能&#xff0c;由美国 TokuTek 公司&#xff08;现在已经被 Percona 公司收购&#xff09;研发。拥有出色的数据压缩功能&#xff0c;如果您的数据写多读少&#xff0c;而且数…

数据归档,存储的完美储备军

数据爆炸性增长的同时&#xff0c;存储成为了大家首要担心的问题 大家都希望自家数据保存20年、50年后仍完好无损 但是&#xff0c;N年后的数据量已达到一个无法预测的峰值 如此大量的数据在保存时极可能存在丢失、损坏等问题 这时需要提前对数据进行“备份”、“归档” 备份是…

oracle数据库归档模式修改ARCHIVELOG

oracle数据库归档模式修改ARCHIVELOG 一、查看当前数据库的归档模式 第一步&#xff1a;查看oracle数据库的归档模式 命令如下&#xff1a;&#xff08;该命令登录sys用户可查&#xff09; select log_mode from v d a t a b a s e ; 如 果 值 为 N O A R C H I V E L O G &am…

数据归档神器-pt-archiver

前言介绍 pt-archiver是用来归档表的工具&#xff0c;可以做到低影响、高性能的归档工具&#xff0c;从表中删除旧数据&#xff0c;而不会对 OLTP 查询产生太大影响。可以将数据插入到另一个表中&#xff0c;该表不需要在同一台服务器上。可以将其写入适合 LOAD DATA INFILE 的…

从MYSQL 数据库归档 到 归档设计

到数据归档&#xff0c;很多人的第一个概念就是&#xff0c;不就是无用的数据&#xff0c;换个地方放吗&#xff0c;直接拷贝&#xff0c;删除不就得了&#xff0c;有那么麻烦。 我见到过的&#xff0c;听到过的数据库归档的方法有以下几种 1 数据通过人工的手段来进行清理&am…

数据存储领域的“归档Archive”

档案圈的朋友想必对档案领域的“归档”一词已经耳熟能详&#xff0c;按照DA/T 58-2014《电子档案管理基本术语》中的定义&#xff0c;归档&#xff08;Archiving&#xff09;是指“按照国家规定将具有保存价值的电子文件及其元数据的保管权交给档案部门的过程”。 今天我们要聊…

那些年跟领导聊过的数据归档【DB篇】:从梳理到落地-DB单表千万级归档详细流程讲解

文章目录 知人论世执笔蓝图V1 - 浅尝辄止V2 - 初窥门镜V3 - 木已成舟 躬行方案安内攘外 卓有成效沉淀之石道阻且长 知人论世 无论何种需求的出现都是因为某种迫切解决的问题契机&#xff0c;它是业务发展中定数也是劫数&#xff0c;近期DBA反馈磁盘存储空间超过80%不足以支撑未…

进来偷学一招,数据归档二三事儿

Hello&#xff0c;大家好&#xff0c;我是楼下小黑哥~ 随着业务的快速增长&#xff0c;业务体量变得越来越大&#xff0c;这个过程我们会碰到各种问题&#xff0c;倒逼着我们进行技术升级。 那今天我们来聊下&#xff0c;这个过程将会碰到关于数据的问题。 数据增长带来的烦…

MySQL 归档数据的方法你知道了吗

归档&#xff0c;在 MySQL 中&#xff0c;是一个相对高频的操作。 它通常涉及以下两个动作&#xff1a; 迁移。将数据从业务实例迁移到归档实例。删除。从业务实例中删除已迁移的数据。 在处理类似需求时&#xff0c;都是开发童鞋提单给 DBA&#xff0c;由 DBA 来处理。 于…

7.数据归档(Archiver)

1.归档的基本概念 归档: 是指将数据写入文件存储到程序的沙盒中,当再次重新打开程序时,可以还原这些数据. 称它为数据序列化, 数据持久化. 临时数据: 存储在内存中的数据, 程序关闭, 内存释放,数据丢失数据持久性的方式 1) NSKeyedArchiver—-对象归档 2) NSUserDefaults 3)…

如何用matlab求出矩阵简化阶梯形顺带算出主元所在的列

matlab用rref函数 函数格式 [R,j]rref(A) A是矩阵 R是简化后的阶梯形 j是主元例子&#xff1a;求矩阵A的简化阶梯形与主元所在的列 >> A [1 1 -2 1 4; 2 4 -6 4 8; 2 -3 1 -1 2; 3 6 -9 7 9]; >> [R,j]rref(A)R 1 0 -1 0 40 1 -1 0 …

(线性代数笔记)2.阶梯型矩阵

1.阶梯形矩阵的定义 矩阵的主元 2.任意矩阵经过有限次初等行变换化为阶梯形 这里C是由B通过初等行变化得到的&#xff0c;C也是A的阶梯形 3.矩阵的秩 例题&#xff08;矩阵通过初等行变换转化为阶梯形&#xff09;

行阶梯型矩阵,行最简形矩阵,标准形矩阵

行阶梯形矩阵&#xff1a; 行最简形矩阵&#xff1a; 标准形矩阵&#xff1a;

MATLAB--矩阵操作(1.4)

矩阵的逆 >> A*inv(A) ans 1.0000 0 -0.0000 -0.0000 1.0000 -0.0000 -0.0000 0 1.0000 >> norm((ans-eye(3))) ans 1.8620e-15 一个矩阵中行&#xff08;列&#xff09;的最大线性无关组的行&#xff08;列&#xff09;向量的个…

python 矩阵化为最简阶梯型

from sympy import Matrix import numpy as np原数据是矩阵matrix A_matrix np.array([[1, 0, 0, 0, 1, 0], [1, 0, 0, 0, 0, 1], [0, 1, 0, 1, 0, 0],[0, 1, 0, 0, 0, 1], [0, 0, 1, 1, 0, 0], [0,0,1,0,1,0],[1,1,1,-1,-1,-1]])#系数矩阵&#xff0c;类型matrix# 阶梯行 A…