【小工匠聊密码学】--对称加密--3DES
时间:2022-06-06
本文章向大家介绍【小工匠聊密码学】--对称加密--3DES,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、什么是3DES
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
image
2、3DES算法特点
(1)密钥长度增加到(112位或者168位)+3*8(24 个校验位),通过增加迭代此次提高安全性。 (2)缺点:处理速度慢、密钥计算时间较长、加密效率不高。
3、3DES算法实现
3.1 JDK 实现
(1)工作模式 ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128. (2) 填充模式 NoPadding、PKCS5Padding、ISO10126Padding (3) 默认密钥长度 168 位 (4) 代码实现
package lzf.cipher.jdk;
import java.nio.charset.Charset;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* @author Java小工匠
*/
public class JdkDes3Utils {
// 获取 3DES Key
public static byte[] get3DesKey() {
try {
// 1、创建密钥生成器
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
keyGenerator.init(168);
// 2、产生密钥
SecretKey secretKey = keyGenerator.generateKey();
// 3、获取密钥
byte[] key = secretKey.getEncoded();
return key;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 3DES 加密
public static byte[] encrypt3Des(byte[] data, byte[] key) {
try {
SecretKey secretKey = new SecretKeySpec(key, "DESede");
String type = "DESede";
// 加工作模式和填充方式
type = "DESede/ECB/PKCS5Padding";
Cipher cipher = Cipher.getInstance(type);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] rsData = cipher.doFinal(data);
return rsData;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 3DES 解密
public static byte[] decrypt3Des(byte[] data, byte[] key) {
try {
SecretKey secretKey = new SecretKeySpec(key, "DESede");
String type = "DESede";
// 加工作模式和填充方式
type = "DESede/ECB/PKCS5Padding";
Cipher cipher = Cipher.getInstance(type);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] rsData = cipher.doFinal(data);
return rsData;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 数据准16进制编码
public static String encodeHex(final byte[] data) {
return encodeHex(data, true);
}
// 数据转16进制编码
public static String encodeHex(final byte[] data, final boolean toLowerCase) {
final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
final char[] toDigits = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER;
final int l = data.length;
final char[] out = new char[l << 1];
// two characters form the hex value.
for (int i = 0, j = 0; i < l; i++) {
out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
out[j++] = toDigits[0x0F & data[i]];
}
return new String(out);
}
public static void main(String[] args) {
byte[] data = "java小工匠".getBytes(Charset.forName("UTF-8"));
byte[] key = get3DesKey();
String hexKeyStr = encodeHex(key);
System.out.println("加密密钥:" + hexKeyStr + ",length=" + hexKeyStr.length());
byte[] encryptData = encrypt3Des(data, key);
System.out.println("加密数据:" + encodeHex(encryptData));
byte[] decryptData = decrypt3Des(encryptData, key);
System.out.println("解密数据:" + new String(decryptData));
}
- 对比cp和scp命令 将数据从一台linux服务器复制到另一台linux服务器
- laravel—用Migration的操作数据库
- 有货移动Web端性能优化探索实践
- webpack打包速度和性能再次优化
- MySQL 清除表空间碎片
- 解决ios不支持按钮:active伪类的方法
- HTTP-FLV直播初探
- BZOJ1058: [ZJOI2007]报表统计
- React数据流和组件间的通信总结
- react+redux+webpack教程4
- 洛谷P2391 白雪皑皑(并查集)
- BZOJ4514: [Sdoi2016]数字配对(费用流)
- 3.2数据结构之指针和链表 1748:约瑟夫问题
- 2017值得一瞥的JavaScript相关技术趋势
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 大型项目技术栈第七讲 Chosen的使用
- 大型项目技术栈第六讲 EasyExcel的使用
- JavaWeb第二讲 重定向与转发 & doGet()与doPost()
- JavaWeb第一讲 Servlet的工作原理及生命周期
- 多系列数据核密度图
- leetcode树之二叉树的层平均值
- 大型项目技术栈第二讲 ES6(ECMAScript 6.0)的使用
- 大型项目技术栈第三讲 ztree的使用
- JavaWeb新手训练经典项目 & 半小时高效开发 & 海量知识点涵盖 = 从这里开始
- Java反射_笔记分享
- Java注解详细总结
- 文档驱动 —— 表单组件(六):基于AntDV的Form表单的封装,目标还是不写代码
- 这就是你日日夜夜想要的docker!!!---------Docker资源控制--Cgroup
- 2020-09-26:请问rust中的&和c++中的&有哪些区别?
- python在Keras中使用LSTM解决序列问题