Java实现对称加密算法 DES/3DES/AES

一、DES加密算法

1.1 原理

DES是一种对称加密算法,它使用相同的密钥进行加密和解密操作。
DES算法的核心是一个称为Feistel网络的结构,它将明文分成左右两部分,并通过多轮迭代和替换操作来生成密文。

DES算法使用56位密钥(实际上有64位,但其中8位用于奇偶校验),并通过一系列复杂的变换和置换操作来加密数据。
这些操作包括初始置换、16轮Feistel网络、以及逆初始置换等步骤。每一轮Feistel网络都包括替换、置换和异或等操作,以增加加密的复杂性和安全性:

1.1.1. 密钥生成

DES算法使用一个56位的密钥(实际上有64位,但其中8位用于奇偶校验,不参与加密过程),并通过一系列复杂的操作生成16个48位的子密钥,每个子密钥用于加密算法的一轮迭代中。密钥生成的过程包括置换、移位和压缩等操作,以确保生成的子密钥具有足够的随机性和复杂性。

1.1.2. 初始置换

在加密过程的开始,明文数据首先经过一个初始置换操作。这个置换是一个固定的置换表,将明文数据的64位重新排列,以打乱数据的原始顺序。初始置换的目的是为了增加加密算法的复杂性和混淆性。

1.1.3. Feistel网络

DES算法的核心是一个称为Feistel网络的结构。Feistel网络将初始置换后的明文数据分成左右两部分,每部分32位。然后,通过16轮迭代,对这两部分数据进行交替的加密操作。

在每一轮迭代中,Feistel网络使用当前轮的子密钥对右半部分数据进行加密,并将加密结果与左半部分数据进行异或运算。然后,将异或运算的结果作为下一轮的右半部分数据,而将原始的左半部分数据作为下一轮的左半部分数据。这样,左右两部分数据在每一轮迭代中都会进行交换和更新。

每一轮迭代中的加密操作包括扩展置换、S盒代替、P盒置换和异或运算四个步骤。扩展置换将32位的数据扩展成48位,以便与48位的子密钥进行异或运算。S盒代替是一种非线性替换操作,将48位的数据分成8个6位的部分,并分别通过8个不同的S盒进行替换,得到8个4位的结果。P盒置换是一种置换操作,将8个4位的结果合并成一个32位的结果。最后,异或运算将P盒置换的结果与左半部分数据进行异或运算,得到加密后的右半部分数据。

1.1.4. 逆置换

经过16轮迭代后,左右两部分数据再次合并成一个64位的数据,并进行一个逆置换操作。逆置换是初始置换的逆过程,将数据的顺序恢复到加密前的状态。最终得到的数据就是加密后的密文。

需要注意的是,DES加密算法的安全性主要依赖于密钥的保密性和算法的复杂性。然而,由于DES算法使用的密钥长度较短(56位),它已经受到暴力破解攻击的威胁。因此,在实际应用中,建议使用更安全的加密算法,如AES(Advanced Encryption Standard)。AES算法提供了更大的密钥长度和更复杂的加密过程,以提供更高的安全性。

1.2 特点

密钥长度较短:DES使用56位密钥,相对于现代加密算法来说,密钥长度较短,容易受到暴力破解攻击。
加密速度快:由于DES算法相对简单,加密和解密速度较快,适用于对性能要求较高的场景。
安全性较低:由于密钥长度较短和算法设计的局限性,DES算法的安全性已经受到质疑,不再适用于高安全性的应用。

1999 年,distributed.net在 22 小时 15 分钟内破解了一个 DES 密钥,
在这事件发生后,NIST 撤回了该算法作为标准。(现在不建议使用了,推荐使用AES)
为了提高安全性,通常使用3DES(Triple DES)来替代DES。3DES是对DES算法进行三次迭代,使用两个或三个不同的密钥,以增强加密的强度。

二、3DES加密算法

2.1 原理

3DES(Triple DES)是DES算法的一种改进版本,旨在提高安全性。它使用三个不同的密钥对明文进行三次DES加密操作。
具体来说,3DES可以采用两种模式:加密-解密-加密(EDE)模式和加密-加密-解密(EEE)模式。其中,EDE模式更为常用。

在EDE模式下,首先使用第一个密钥对明文进行DES加密;然后使用第二个密钥对加密后的结果进行DES解密;
最后使用第三个密钥再次对解密后的结果进行DES加密。这样,通过增加密钥数量和加密轮数,3DES提高了算法的安全性和复杂性。

2.2 特点
  1. 安全性较高:由于使用了三个密钥和三轮加密操作,3DES算法的安全性相对于DES算法有了显著的提升。它提供了更高的密钥长度和更复杂的加密过程,使得破解更加困难。

  2. 加密速度较慢:与DES算法相比,3DES算法的加密和解密速度较慢。这是因为它需要进行三轮加密操作,每轮操作都需要进行复杂的替换、置换和异或等计算。

  3. 密钥管理较复杂:由于使用了三个密钥,3DES算法的密钥管理相对复杂。需要确保三个密钥的安全性和独立性,以防止密钥泄露和攻击。

三、AES 加密算法(推荐使用)

简介

AES 数据加密是一种在数学上更高效、更优雅的加密算法,由美国国家标准与技术研究院于 2001 年推出。
作为高级加密标准,AES提供三种密钥长度,分别是128 位、192 位和 256 位,密钥长度越高,
破解系统或破解系统所需的时间就越多。因此,AES 被认为比 DES 算法更好。
高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击。

AES 在通过计算机网络传输数据时被广泛使用,特别是在无线网络中,AES 使用 128 位明文和 128 位密钥来创建 128 位块,
然后对其进行处理以生成 16 字节(128 位)密文。

高级加密标准的加密过程是基于迭代方式的替换和置换操作,16 字节的数据以四列四行的矩阵排列,在这个矩阵上,AES 执行几轮替换置换操作。

这些轮次中的每一轮都使用不同的密码密钥,该密钥是根据原始 AES 密钥计算得出的,操作的轮数取决于密钥的大小,方式如下:

  • 128 位密钥,10 轮
  • 192 位密钥,12 轮
  • 256 位密钥,14 轮
特点

密钥建立时间短、灵敏性好、内存需求低、安全性高

代码demo


import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Base64;public class BaseSymmetry {/*** 生成DES密钥*/public static SecretKey generateKey(String algorithm) throws Exception {//密钥生成器KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);SecureRandom random = new SecureRandom(String.valueOf(System.currentTimeMillis()).getBytes(StandardCharsets.UTF_8));//可指定密钥长度switch (algorithm) {case "DES": {//固定长度56keyGenerator.init(56, random);break;}case "DESede": {//可指定密钥长度为112或168,默认为168// 3DES密钥长度通常是168位,但实际上会使用192位(24字节),最后24位作为奇偶校验位keyGenerator.init(168, random);break;}case "AES": {//这里可以是 128、192、256、越大越安全keyGenerator.init(256, random);break;}default: {keyGenerator.init(random);}}//生成keyreturn keyGenerator.generateKey();}/*** 将密钥转成字符串** @param secretKey* @return*/public static String Key2Str(SecretKey secretKey) {//密钥数组byte[] key = secretKey.getEncoded();//转换成字符串return Base64.getEncoder().encodeToString(key);}/*** 将使用 Base64 加密后的字符串类型的 secretKey 转为 SecretKey** @return SecretKey*/public static SecretKey strKey2SecretKey(String strKey, String algorithm) {byte[] bytes = Base64.getDecoder().decode(strKey);return new SecretKeySpec(bytes, algorithm);}/*** 加密** @param content   待加密内容* @param secretKey 加密使用的 AES 密钥* @return 加密后的密文 byte[]*/public static byte[] encrypt(byte[] content, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, secretKey);return cipher.doFinal(content);}/*** 加密** @param content   待加密内容* @param secretKey 加密使用的 AES 密钥* @return 加密后的密文 byte[]*/public static byte[] encrypt(String content, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, secretKey);return cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));}/*** 解密** @param content   待解密内容* @param secretKey 解密使用的 AES 密钥* @return 解密后的明文 byte[]*/public static byte[] decrypt(String content, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, secretKey);return cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));}/*** 解密** @param content   待解密内容* @param secretKey 解密使用的 AES 密钥* @return 解密后的明文 byte[]*/public static byte[] decrypt(byte[] content, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, secretKey);return cipher.doFinal(content);}public static void main(String[] args) throws Exception {String algorithm = "DES";
//        String algorithm = "DESede";
//        String algorithm = "AES";//生成密钥keySecretKey key = BaseSymmetry.generateKey(algorithm);//转成字符串String keyStr = Base64.getEncoder().encodeToString(key.getEncoded());System.out.println("经BASE64处理之后的密钥 : " + keyStr);//根据字符串再生成密钥keykey = BaseSymmetry.strKey2SecretKey(keyStr, algorithm);//明文String plainText = "我是明文";//加密byte[] encryptedBytes = BaseSymmetry.encrypt(plainText, key);String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("Encrypted Text: " + encryptedText);//解密byte[] decryptedBytes = BaseSymmetry.decrypt(encryptedBytes, key);System.out.println("Decrypted Text: " + new String(decryptedBytes));}
}

喜欢文章的朋友欢迎关注公众号

参考

Java中的DES和3DES加密算法详解_java des-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/823717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的装饰工程管理系统(源码+文档+包运行)

一.系统概述 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统装饰工程项目信息管理难度大,容错率低&a…

面试突击---MySQL索引

面试突击---MYSQL索引 面试表达技巧:1、谈一下你对于mysql索引的理解?(为什么mysql要选择B树来存储索引)2、索引有哪些分类?3、聚簇索引与非聚簇索引4、回表、索引覆盖、最左匹配原则、索引下推(1&#xff…

概念解读稳定性保障

什么是稳定 百度百科关于稳定的定义: “稳恒固定;没有变动。” 很明显这里的“稳定”是相对的,通常会有参照物,例如 A 车和 B 车保持相同速度同方向行驶,达到相对平衡相对稳定的状态。 那么软件质量的稳定是指什么…

小白必看的Ubuntu20.04安装教程(图文讲解)

总的来说,安装Ubantu包含以下三个步骤: 一、安装虚拟机 二、Ubuntu镜像下载 三、虚拟机配置 一、安装虚拟机 选择安装VMware Workstation,登录其官网下载安装包,安装点这里。 下载后运行安装向导,一直Next即可。最…

2024腾讯一道笔试题--大小写字母移动

题目🍗 有一个字符数组,其中只有大写字母和小写字母,将小写字母移到前面, 大写字符移到后面,保持小写字母本身的顺序不变,大写字母本身的顺序不变, 注意,不要分配新的数组.(如:wCelOlME,变为wellCOME). 思路分析🍗 类似于冒泡排序,两两比较…

ssm055基于spring框架的中小企业人力资源管理系统的设计及实现+jsp

中小企业人力资源管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本中小企业人力资源管理系统就是在这样的大环境下诞生,其可…

[lesson39]逗号操作符的分析

逗号操作符的分析 逗号操作符 逗号操作符(,)可以构成逗号表达式 逗号表达式用于将多个子表达式连接成为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式中的前N-1个子表达式可以没有返回值逗号表达式按照从左向右的顺序计算每个子表达式的值 重载逗号操作符 在C…

OPC-UA是这样在食品和饮料中应用的

什么是 OPC-UA OPC Unified Architecture,即 OPC-UA,是一种基于 TCP/IP 的协议,用于自动化工程师实时、高可靠性、高效性地在控制系统级别共享数据。 OPC-UA 的特点 安全通信: OPC-UA 使用先进的加密方法和严格的访问控制,确保数…

CV每日论文--2024.4.15

1、Connecting NeRFs, Images, and Text 中文标题:连接 NeRF、图像和文本 简介:神经辐射场(NeRFs)已经成为表示3D场景和物体的标准框架,引入了一种新的数据类型用于信息交换和存储。与此同时,多模态表示学…

Excel文件解析(Java)

一、概述 在应用程序的开发过程中,经常需要使用 Excel文件来进行数据的导入或导出。所以,在通过Java语言实现此类需求的时候,往往会面临着Excel文件的解析(导入)或生成(导出)。 在Java技术生态圈中&#xff0c…

<计算机网络自顶向下> 多路复用与解复用

多路复用/解复用 端口号区分进程到进程多路解复用工作原理 解复用作用:TCP或者UDP实体采用哪些信息,将报文段的数据部分交给正确的socket,从而交给正确的进程主机收到IP数据报 每个数据报有源IP地址和目标地址每个数据报承载一个传输层报文段…

(算法版)基于二值图像数字矩阵的距离变换算法

Hi,大家好,我是半亩花海。本项目展示了欧氏距离、城市街区距离和棋盘距离变换的实现方法。通过定义一个距离变换类,对输入图像进行距离变换操作,并生成对应的距离矩阵。在示例中,展示了在一个480x480的全黑背景图像上设…

App Inventor 2 块拓展之:最大值、创建多项列表

什么是块拓展? App Inventor 2 引入了一项新功能,允许某些块扩展、收缩甚至更改其功能。 顶部具有蓝色框白色齿轮的代码块都是可拓展块。 块拓展用法 块扩展可以改变形状,通过单击蓝色图标,用户可以将较小的块拖到较大的块中&am…

雨伞-浅色脚本

渲染参考:明亮/干净/高级 静帧参考 解说 镜头时长 效果参考 中景画面展示3把竖着的浅色的伞 1s / 特写展示伞把手 1s 中景展示雨伞全貌 2s 微观镜头 缝线动画 3s 镜头旋转至伞面微观材质镜头,展现其多层结构 10s 微观镜头 水珠滑动在伞…

gpt4和chatgpt的区别

模型规模和性能:GPT-4比GPT-3.5更大、更强大。GPT-4拥有更多的参数和更大的训练数据集,因此在各种任务上表现更出色,如语言理解、问题解答和推理能力等。多模态能力:GPT-4支持处理图像等多模态信息,而GPT-3.5主要处理文…

服务器raid卡,守护数据安全,赋能新质生产力

RAID卡,全称为独立冗余磁盘阵列卡,在数据中心、服务器、网络存储等领域得到广泛应用,RAID卡通过不同的RAID级别实现数据容错和冗余。例如,RAID 0主要适用于需要高速数据传输但对数据安全要求不高的场景,如数据的缓存&a…

基于改进遗传算法的配电网故障定位(matlab代码)

1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》,将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立区域, 再利用该算法分别对各独立区域进行故障定位, 然后进行…

Node Version Manager(nvm):轻松管理 Node.js 版本的利器

文章目录 前言一、名词解释1、node.js是什么?2、nvm是什么? 二、安装1.在 Linux/macOS 上安装2.在 Windows 上安装 二、使用1.查看可安装的node版本2.安装node3. 查看已安装node4.切换node版本5.其它 总结 前言 Node.js 是现代 Web 开发中不可或缺的一部…

java的转换流,打印流,数据流

InputStreamReader(字符输入转换流) 解决不同编码,字符流读取文本内容乱码的问题 public InputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException Creates an InputStreamReader that uses the named charset. 把原始的字节…

【华为笔试题汇总】2024-04-17-华为春招笔试题-三语言题解(Python/Java/Cpp)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&#x1f…