【对称加密】DES与AES算法详解及Java实现
对称加密:DES与AES算法详解及Java实现
目录
1. 对称加密概述
对称加密是指加密和解密使用相同密钥的加密算法。主要特点包括:
- 高效性:比非对称加密快100-1000倍
- 密钥管理:需要安全地共享密钥
- 常见算法:DES、3DES、AES、Blowfish等
- 应用场景:大数据量加密、SSL/TLS会话密钥、磁盘加密等
基本流程:
明文 + 密钥 → 加密算法 → 密文
密文 + 密钥 → 解密算法 → 明文
2. DES算法详解
基本概念
- Data Encryption Standard (数据加密标准)
- 1977年被NIST采纳为联邦标准
- 分组长度:64位
- 密钥长度:56位(实际64位,含8位奇偶校验)
- 已被认为不够安全(1999年被暴力破解)
核心原理
- 初始置换(IP):打乱64位明文的顺序
- 16轮Feistel网络:
- 将数据分为左右两半(各32位)
- 右半通过扩展置换(32→48位)
- 与子密钥异或
- 通过S盒替换(48→32位)
- 与左半异或并交换左右
- 最终置换(FP):IP的逆置换
密钥生成
- 从64位密钥中去掉8位校验位
- 通过置换选择PC-1得到56位密钥
- 每轮左移1-2位生成16个子密钥
安全性问题:
- 56位密钥太小(2⁵⁶种可能)
- 存在弱密钥和半弱密钥
- 已被AES取代
3. AES算法详解
基本概念
- Advanced Encryption Standard (高级加密标准)
- 2001年取代DES成为新标准
- 分组长度:128位
- 密钥长度:128/192/256位
- 目前最安全的对称加密算法
核心原理(Rijndael算法)
- 字节替换(SubBytes):使用S盒进行非线性替换
- 行移位(ShiftRows):每行循环左移不同位数
- 列混淆(MixColumns):矩阵乘法混淆数据
- 轮密钥加(AddRoundKey):与子密钥异或
加密轮数:
- 128位密钥:10轮
- 192位密钥:12轮
- 256位密钥:14轮
密钥扩展
- 将初始密钥扩展为(轮数+1)×128位的轮密钥
- 使用Rcon常量和S盒进行非线性变换
优势:
- 更强的安全性(最小128位密钥)
- 更高的效率(适合硬件实现)
- 无已知的有效攻击方式
4. Java实现示例
DES加密解密示例
import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.spec.KeySpec;
public class DESExample {
public static void main(String[] args) throws Exception {
String plainText = "Hello, DES!";
String secretKey = "MySecretKey"; // 至少8字节
// 密钥生成
KeySpec keySpec = new DESKeySpec(secretKey.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(keySpec);
// 加密
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
System.out.println("Encrypted: " + bytesToHex(encrypted));
// 解密
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("Decrypted: " + new String(decrypted));
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
}
AES加密解密示例
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;
public class AESExample {
public static void main(String[] args) throws Exception {
String plainText = "Hello, AES!";
String secretKey = "MySuperSecretKey123"; // 16/24/32字节
// 确保密钥长度正确
byte[] keyBytes = new byte[16]; // 128位
System.arraycopy(secretKey.getBytes(), 0, keyBytes, 0, Math.min(secretKey.length(), keyBytes.length));
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
// 加密
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));
// 解密
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("Decrypted: " + new String(decrypted));
}
}
更安全的AES-CBC模式示例
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;
public class AESCBCExample {
public static void main(String[] args) throws Exception {
String plainText = "Hello, AES CBC Mode!";
String secretKey = "ThisIsA128BitKey!!"; // 16字节
// 生成随机IV(初始化向量)
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "AES");
// 加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
// 组合IV和密文(IV不需要保密)
byte[] combined = new byte[iv.length + encrypted.length];
System.arraycopy(iv, 0, combined, 0, iv.length);
System.arraycopy(encrypted, 0, combined, iv.length, encrypted.length);
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(combined));
// 解密
byte[] extractedIv = new byte[16];
byte[] extractedCipherText = new byte[combined.length - 16];
System.arraycopy(combined, 0, extractedIv, 0, 16);
System.arraycopy(combined, 16, extractedCipherText, 0, extractedCipherText.length);
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(extractedIv));
byte[] decrypted = cipher.doFinal(extractedCipherText);
System.out.println("Decrypted: " + new String(decrypted));
}
}
5. 安全注意事项
密钥管理
- 密钥生成:使用
SecureRandom生成随机密钥 - 密钥存储:使用密钥管理系统或硬件安全模块(HSM)
- 密钥轮换:定期更换密钥
算法选择建议
- 优先使用AES:至少128位,推荐256位
- 避免使用DES:除非遗留系统要求
- 模式选择:
- CBC模式(需要随机IV)
- GCM模式(同时提供加密和认证)
- 避免ECB模式(相同明文产生相同密文)
其他安全实践
- 始终使用完整的初始化向量(IV)
- 对密文进行完整性验证(如HMAC)
- 使用适当的填充方案(PKCS#5/PKCS#7)
- 处理
BadPaddingException时不泄露具体错误信息
6. 总结
对比DES和AES
| 特性 | DES | AES |
|---|---|---|
| 密钥长度 | 56位 | 128/192/256位 |
| 分组大小 | 64位 | 128位 |
| 安全性 | 已不安全 | 目前安全 |
| 性能 | 较慢 | 更快 |
| 轮数 | 16轮 | 10/12/14轮 |
选择建议
- 新系统:始终使用AES(至少128位)
- 遗留系统:考虑3DES过渡到AES
- 高安全性需求:使用AES-256 + GCM模式
最佳实践
- 结合对称和非对称加密(如RSA加密AES密钥)
- 使用标准库而非自己实现加密算法
- 定期评估加密方案的安全性
通过合理选择和实现对称加密算法,可以有效保护数据机密性。记住加密只是安全体系的一部分,需要结合认证、访问控制等其他措施构建完整的安全解决方案。
【对称加密】DES与AES算法详解及Java实现的更多相关文章
- Heapsort 堆排序算法详解(Java实现)
Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择 ...
- 算法笔记_066:Kruskal算法详解(Java)
目录 1 问题描述 2 解决方案 2.1 构造最小生成树示例 2.2 伪码及时间效率分析 2.3 具体编码(最佳时间效率) 1 问题描述 何为Kruskal算法? 该算法功能:求取加权连通图的最小 ...
- 排序算法详解(java代码实现)
排序算法大致分为内部排序和外部排序两种 内部排序:待排序的记录全部放到内存中进行排序,时间复杂度也就等于比较的次数 外部排序:数据量很大,内存无法容纳,需要对外存进行访问再排序,把若干段数据一次读 ...
- 安全体系(一)—— DES算法详解
本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(二)——RSA算 ...
- Asp.Net 常用工具类之加密——对称加密DES算法(2)
又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...
- 安全体系(二)——RSA算法详解
本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 ...
- 介绍对称加密的另一个算法——PBE
除了DES,我们还知道有DESede(TripleDES,就是3DES).AES.Blowfish.RC2.RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法 ...
- 安全体系(三)——SHA1算法详解
本文主要讲述使用SHA1算法计算信息摘要的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 安全体系(二)——RSA算法详解 为保 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
随机推荐
- 地球OL攻略 —— 某应届生求职总结
某应届生的苦逼求职总结 1.自我介绍,阐述一下自己过去的情况 2.目前的就业情况以及从事的就业方向 3.你在面试的时候遇到什么困难?是怎么帮忙解决的 4.当初为什么会选择选择这一行? 5.分享一下学习 ...
- Calico Kernel's RPF check is set to 'loose'
前言 K8s 集群部署使用了 calico 网络插件,而calico node 节点发生如下报错: 2023-03-13 11:19:36.622 [FATAL][828] int_dataplane ...
- kubectl port-forward bind: address already in use unable
前言 本地的 8080 映射到 Pod 的 80,kubectl 会把这个端口的所有数据都转发给集群内部的 Pod kubectl port-forward wp-pod 8080:80 & ...
- jquery的radio的change事件
一.用的jquery的radio的change事件:当元素的值发生改变时,会发生 change 事件,radio选择不同name值选项的时候恰巧是值发生改变 表单单选框 <input type= ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)
1.问题描述: 使用华为内置的MapComponent, 发现显示不出来.查看日志, MapRender底层有报错. 解决方案: 麻烦按以下步骤检查下地图服务,特别是签名证书指纹那部分. 1.一般没有 ...
- BUUCTF---RSA3(共模攻击)
1.题目 RSA已知e1,e2,c1,c2 2.知识 共模攻击使用相同N作为加密的模数,如果监听者获知了c1,c2的密文,那么监听者便不需要d1,d2即可解出明文m 3.解题 按照思路编写代码解题 点 ...
- apisix~key-auth多消费的使用
在 APISIX 中使用 key-auth 插件实现基于密钥的认证,以下是详细的配置步骤,包括如何保存密钥和证书,以及如何将这些信息分配给客户端 A 和 B. 场景说明 服务 C 是后端服务,需要通过 ...
- 【JDBC第1章】JDBC概述
第1章:JDBC概述 1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以 ...
- 【Web】支持纯静态的Layuimini版本
支持纯静态的Layuimini版本 本人做了点小小的改动,在来的基础上添加了对静态的支持. 零.起因 要做个项目,但是用的是JSP,想着用Layui,然后去找模板,发现这个Layuimini.但是这个 ...
- datasnap的多表更新
补课很多,xe一路走来,提供了许许多多的多层数据处理的方法.确实已经提供数个最优方案. 把下面的图跑通了,也就解决核心问题了. [Berlin datasnap开发手册p261] 补充: