内容简介:说明:上篇RSA是一种非对称的加解密算法,今天这种是一种对称的加解密算法DESDES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。Java里封装了很多种对称加密算法的使用,这里以DES为例。对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。加密与解密互逆,在大多数对称算法中,加密解密密钥是相同的。:进行安全通信前需
说明:上篇RSA是一种非对称的加解密算法,今天这种是一种对称的加解密算法DESDES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。Java里封装了很多种对称加密算法的使用,这里以DES为例。
一、什么是对称算法
对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。加密与解密互逆,在大多数对称算法中,加密解密密钥是相同的。
:进行安全通信前需要以安全方式进行密钥交换,安全得不到有效保证,规模旁杂。
二、密钥的机制
DES密钥初始化的长度是64位,而实际可用的位置是56位,因为DES算法规定,第8、16、……64位是奇偶校验位,不参与DES运算。 1、初始序化Key的长度
图 3
然后去掉最后一位,可以发现前7位是一样的。所以这样解释了为什么有时候加密序列不同,加密后的内容却是完全一样。
三、完整的DEMO
如果让Base64具有加解密的功能,至少要一部分是变化的;这里可以通过变化标准序列的方式;建议大家用到的时候,可以先看一下第3部分中标出那个类的源码(没几行代码);这个变化的序列可以根据时间、根据UUID、根据一切可以变换的东西来生成,这里是根据UUID来随机生成序列。 1、生成随机序列
package c.d.des;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class DesTest {
Cipher cipher = null;
public DesTest() {
init();
}
public void init() {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56);
cipher = Cipher.getInstance("DES");
} catch (Exception e) {
e.printStackTrace();
}
}
// 二进制转换字符串
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
// 获取Key
public Key getKey(byte[] passKey) {
Key convertSecretKey = null;
try {
DESKeySpec deSedeKeySpec = new DESKeySpec(passKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
convertSecretKey = factory.generateSecret(deSedeKeySpec);
} catch (Exception e) {
e.printStackTrace();
}
return convertSecretKey;
}
// 加密
public byte[] encode(byte[] source, Key key) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encodeSource = cipher.doFinal(source);
return encodeSource;
}
// 解密
public String decode(byte[] encodeSource, Key key) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decodeRes = cipher.doFinal(encodeSource);
return new String(decodeRes, "UTF-8");
}
public static void main(String[] args) throws Exception {
DesTest dt = new DesTest();
byte[] passKey = new byte[] {11, 12, 13, 14, 15, 16, 17,18,19,20 };
System.out.println(passKey.length);
Key key = dt.getKey(passKey);
String obj = "就先测试这句吧";
System.out.println("加密前:" + obj);
byte[] source = dt.encode(obj.getBytes("UTF-8"), key);
System.out.println("加密后:" + bytesToHexString(source));
String res = dt.decode(source, key);
System.out.println("解密后:" + res);
String s1 = "0815d22bf5ae0bdd9d37594cedd4be6c1fead86115544517";
String s2 = "0815d22bf5ae0bdd9d37594cedd4be6c1fead86115544517";
System.out.println(s1.equals(s2));
}
}
复制代码
四、后续
既然DES通过暴力一天便可破解,那么3DES如何?大家可以自行研究一下,和DES类似。
持续更新中,可以关注........
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring解密 - 默认标签的解析
- Spring解密 - 自定义标签与解析
- Spring解密 - XML解析 与 Bean注册
- APICloud解密本地资源到逆向APP算法到通用资源解密
- NodeJS加密解密,node-rsa加密解密用法
- CMSEasy企业建站源代码解密工具,适用于纯本地解密机制!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出MFC (第二版)
侯俊杰 / 华中科技大学出版社 / 2001-1 / 80.00元
《深入浅出MFC》分为四大篇。第一篇提出学习MFC程序设计之前的必要基础,包括Widnows程序的基本观念以及C++的高阶议题。“学前基础”是相当主观的认定,但作者是甚于自己的学习经验以及教学经验,其挑选应该颇具说服力。第二篇介绍Visual C++整合环境开发工具。此篇只是提纲挈领,并不企图取代Visual C++使用手册;然而对于软件使用的老手,此篇或已足以帮助掌握Visual C++整合环境......一起来看看 《深入浅出MFC (第二版)》 这本书的介绍吧!