Java之DES加解密解析

栏目: 编程工具 · 发布时间: 7年前

内容简介:说明:上篇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为例。

一、什么是对称算法

对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。加密与解密互逆,在大多数对称算法中,加密解密密钥是相同的。

Java之DES加解密解析
图 1 优点 :效率高(加/解密速度能达到数十兆/秒或更多),算法简单,系统开销小,适合加密大量数据。 缺点

:进行安全通信前需要以安全方式进行密钥交换,安全得不到有效保证,规模旁杂。

二、密钥的机制

DES密钥初始化的长度是64位,而实际可用的位置是56位,因为DES算法规定,第8、16、……64位是奇偶校验位,不参与DES运算。 1、初始序化Key的长度

Java之DES加解密解析
图 2 所以这里最好不要去指定长度了,默认的就是56了。 2、如果指定的key超过64位有啥影响
Java之DES加解密解析

图 3

Java之DES加解密解析
图 4 通过上面图3、图4对比可知(加密后序列一样,大家可以直接把生成key序列16进制打出来更直观),初始的key序列超过8字节64位,会自动截取掉,后面多余长度不参与key生成。 3、不同的加密序列加密后结果一样
Java之DES加解密解析
图 5 参考图3、图5将字节数组中的18->19,发现加密后的序列完全一样。啥原因呢?在上面已经提到过,DES实现中第8、16、32... 64位为校验位,相当于只是用每个字节中的前7位进行生成;将18、19转化为二进制为0001001 0 、0001001 1

然后去掉最后一位,可以发现前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类似。

持续更新中,可以关注........

Java之DES加解密解析

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTTP Essentials

HTTP Essentials

Stephen A. Thomas、Stephen Thomas / Wiley / 2001-03-08 / USD 34.99

The first complete reference guide to the essential Web protocol As applications and services converge and Web technologies not only assume HTTP but require developers to manipulate it, it is be......一起来看看 《HTTP Essentials》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具