Java实现3DES加解密算法(1)

简介: Java实现3DES加解密算法(1)

1.实验目的

1.1实验要求

1.编程实现DES加密和解密算法,并使用DES加解密算法实现3DES加解密算法

2.选择一种填充方式,对需要加密的文件进行填充(解密要去掉填充部分)。

3.DES的加解密的工作模式,采用密码分组链接(CBC)模式

4.读取/写入被加密/解密文件时,采用字节流的形式进行文件读取/写入

5.完成实验后,需要交实验报告(包括:重要函数的功能分析和流程图)


1.2实验任务

基于3DES加解密算法,编程实现对任意文件实现加解密的小软件。


1.3实验内容

1.掌握DES算法的原理及过程

2.完成DES密钥扩展运算

3.完成DES数据加解密运算

4.基于已经实现的DES模块进一步实现3DES加解密算法

5.对3DES实现最后一个分组填充(本文采用全零填充方式)

6.3DES的加解密的分组工作模式,采用密码分组链接(CBC)模式

7.实现用户UI界面,方便用户使用

8.进行加解密测试,验证代码正确性


2.实验原理以及应用

2.1实验原理

明文M,密文C,密钥k1,k2和k3,加密算法E解密算法D。3DES算法的过程可表示为:加密:C=Ek3(Dk2(Ek1(M))) 即对明文数据进行,加密,解密,加密的顺序过程,最后得到密文数据解密:M=Dk1(Ek2(Dk3©)) 即对密文数据进行,解密,加密,解密的顺序过程,最后得到明文数据。k1可以等于k3,但不能三个密钥均相等(如果相等的话就成了DES算法了,减弱了3DES的安全性)。3DES可以是3DES-CBC,在原来的加密或者解密处增加了异或运算的步骤,用来提高算法的安全性。

3DES使用3个8字节长度(64位二进制)的密钥,即k1,k2,k3,然后进行加密运算和解密运算。3DES(K1≠K2≠K3),在3DES加密时,对加密——解密——加密依次使用密钥1、密钥2、密钥3,在3DES解密时对解密加密解密依次使用密钥3、密钥2、密钥1。由于DES加解密算法是每8个字节作为一个加解密数据块,因此在实现该算法时,需要对数据进行分块和补位操作(即最后不足8字节时,要补足8字节,本文采用全零填充)。 3DES的CBC工作模式:将待处理的数据分组,但是每一组数据在加密或者解密之前都要与前一块的结果做一次异或操作。该模式需要定义一个特殊的8字节初始化向量IV,用于和第一组数据进行异或操作。注意IV参数是对应CBC模式的。这样一来,每一组数据都是有联系的,并且增加了一个随机变量IV更加可以提高算法的安全性。


2.2实验背景

在DES中,初始置换IP和初始逆置换IP-1各使用一次,使用这两个置换的目的是为了把数据彻底打乱重新排列。它们对数据加密所起的作用不大,因为它们与密钥无关且置换关系固定,所以一旦公开,它们对数据的加密便无多大价值。

在DES算法加密过程中除了S盒是非线性变换外,其余变换均为线性变换。因此S盒是DES算法安全的关键。任意改变S盒输入中的一位,其输出至少有两位发生变化。由于在DES中使用了16次送代,所以即使改变明文或密钥中的1位,密文中都会大约有32位发生变化。S盒的设计原则一直没有完全公开。经过多年来的研究,人们的确发现了S盒的许多规律,但至今还没有发现S盒的致命缺陷。

由于DES算法是公开的,因此其安全性完全依赖于所用的密钥(符合柯克霍夫原则,即密码体制的安全性不应依赖加密算法的保密性,而应取决于可随时改变的密钥)。在算法使用过程中,每次迭代时都有一个子密钥供加密使用。子密钥的产生也很有特色,它确保密钥中各位的使用次数基本相等。大量实验表明,56位密钥中每位的使用次数在12次至15次之间。在实际使用中,需要注意的是DES算法存在一些弱密钥。所谓弱密钥是指一个密钥产生的所有子密钥都是相同的,此时对消息加密两次就可以恢复出明文。虽然DES算法有弱密钥现象,但是弱密钥所占比例很小,可以在选取密钥时避开使用,因此对其安全性影响不大。

随着密码分析技术和计算能力的提高DES的安全性受到质疑和威胁。密钥长度较短是DES的一个主要缺陷。DES 的实际密钥长度为56位,密钥量仅为256≈1017,就目前计算设备的计算能力而言,DES不能抵抗对密钥的穷举搜索攻击。1998 年7月,电子边境基金会(EFF)使用台价值 25万美元的计算机在56小时内成功地破译了DES。在1999年1月,电子边境基金会(EFF)仅用22小时15分就成功地破译了DES。

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

3DES中的key1,key2,key3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,key1可以等于key3。在这种情况下,密钥的有效长度为112位。

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

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


3.实验步骤

对本文3DES加解密算法的几点说明:

1.DES算法通过读入64位二进制密钥和一个标志加解密的标志对读入64位二进制输入(明文或者密文)进行加解密操作。

2.3DES使用3DES-CBC模式:该模式中共使用3个不同密钥,依次用加密—解密—加密。

3.3DES使用全零填充和CBC工作模式。

4.3DES所需要的3个密钥k1,k2,k3和一个初始化向量IV均可以由用户设置(以16位16进制的形式)。


3.1实现DES加解密算法

DES是一个分组加密算法,它以64位二进制为一个分组对数据加密。64位一组的明文从算法一端输入,得到长度相等的64位密文从另一段输出。DES是一个对称算法:加密和解密用的是同一个算法。

密钥通常表示为64位二进制数,但每个第8位都用作奇偶校验,可以忽略,所以密钥长度为56位。密钥可以是任意的56位的数,且可在任意的时候改变。

对于任意的加密方案,总有两个输入:明文和密钥。DES 的明文长为64位,密钥长为

56位。明文的处理一般经过三个阶段: 首先, 64位的明文经过初始置换(IP) 而被重新排

列。然后经历16 轮函数的作用,每轮作用都有置换和替代。最后一轮迭代的输出有64位,它是输入明文和密钥的函数。其左半部分和右半部分互换产生预输出。最后预输出再被与初始置换(IP)互逆的置换产生64位的密文。

DES算法的本质是将加密的两个基本技术——混淆和扩散的组合在一起,先替代后置换。通过P盒和S盒完成置换和替代工作,其中S盒是DES唯一的非线性结构。

本文DES算法,首先将16进制16位的数组转换成64位二进制字符数组,然后根据子密钥生成的规则生成子密钥并保存以便后来使用;最后在进行初始置换之后进行16轮运算,再进行初始逆置换得到最终结果。DES算法的主流程图如图1所示;子密钥生成流程图如图2所示;轮函数f的流程图如图3所示。

image.png

image.png




DES算法核心代码如图4,5,6,7所示。

image.png

image.png

3.2实现3DES加解密算法

首先对3DES函数的输入和输出进行说明:3DES要求输入待处理的文件路径(包括加解密),输出结果文件路径,一个64位字符数组表示的二进制初始化向量IV,三个64位字符数组表示的二进制密钥key1,key2,key3,以及一个加解密标志flag。3DES的输出的生成结果文件。如果是加密生成的结果文件路径用Epath存储,如果是解密生成的结果文件路径用Dpath存储。

3DES完成了对文件字节流的处理,全零填充和CBC分组工作模式。3DES算法核心代码如图8,9,10所示;3DES流程图如图11所示;3DES的核心代码如图12,13,14所示。

image.png


对图进行简要说明,Java提供了直接将文件按字节流形式读入的函数,这样可以直接将文件的字节流形式存入字节数组,但是由于3DES是要调用之前写好的DES完成加解密工作。因此,在调用DES处理之前要将数据类型进行转换。而直接将一个字节型数据转换成八个字符型数据是不容易的。所以,将字节型数据进行划分,将它看成是两个16进制数的组合。例如字节型数据“11110001”,可以看成是16进制的“F1”。将字节型数组数据,首先转换成StringBuffer型数据。如图所示。然后再使用Java提供的toString()和toCharArray()方法完成到字符数组的变换。

image.png

image.png

image.png


image.png

image.pngimage.png

3.3设计UI界面

使用Java的JFrame进行UI界面的设计。在java中顶层容器有三种,分别是JFrame(框架窗口,即通常的窗口)、JDialog(对话框)、JApplet(用于设计嵌入在网页中的java小程序),顶层容器是容纳其它组件的基础,即设计图形化程序必须要有顶层容器。Java中间容器是可以包含其它相应组件的容器,但是中间容器和组件一样,不能单独存在,必须依附于顶层容器。

常见的中间容器有: JPanel:最灵活、最常用的中间容器。UI界面的展示在报告第四部分给出,代码部分由于不是课程设计的重点不在这里赘述。

相关文章
|
7月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
7月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
310 0
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
11月前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
843 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2042 2
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
算法 Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
234 0
|
搜索推荐 算法 Java
插入排序算法(Java代码实现)
这篇文章通过Java代码示例详细解释了插入排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过插入排序对数组进行升序排列。