第七章 对称加密算法--DES
注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第7章“初等加密算法--对称加密算法”
7.1、对称加密算法
特点:
- 加密与解密使用同一个密钥
- 是使用最广的算法
常见对称加密算法:
- DES(已被破解,但是是其他对称算法的基石)
- DESede(处理速度慢、加密耗时,也不常用)
- AES(DES的替代者,最常用)
- IDEA(目前常用的电子邮件加密算法)
- PBE(对已知对称加密进行包装)
7.2、DES(已破解,基本不用)
实现方式:
- JDK(提供56位密钥,提供PKCS5Padding的填充模式)
- Bouncy Castle(提供64位密钥,提供PKCS7Padding的填充模式)
由于DES已被破解,现在企业基本已不再使用,此处只列出基于JDK实现的代码。
package com.util.des; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.apache.commons.codec.binary.Base64; /** * 基于JDK的DES算法 */ public class DESJDK { private static final String ENCODING = "UTF-8"; private static final String KEY_ALGORITHM = "DES";//产生密钥的算法 private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";//加解密算法 格式:算法/工作模式/填充模式 /** * 产生密钥 */ public static byte[] getKey() throws NoSuchAlgorithmException{ KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM); keyGenerator.init(56);//初始化密钥长度 SecretKey key =keyGenerator.generateKey();//产生密钥 return key.getEncoded(); } /** * 还原密钥:二进制字节数组转换为十六进制字符串 */ public static Key toKey(byte[] keyByte) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException{ DESKeySpec desKeySpec = new DESKeySpec(keyByte); return SecretKeyFactory.getInstance(KEY_ALGORITHM).generateSecret(desKeySpec); } /** * DES加密 * @param data 带加密数据 * @param keyByte 密钥 */ public static byte[] encrypt(String data, byte[] keyByte) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{ Key key = toKey(keyByte);//还原密钥 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, key);//设置加密模式并且初始化key return cipher.doFinal(data.getBytes(ENCODING)); } /** * DES加密,并转为16进制字符串或Base64编码字符串 */ public static String encryptDESHex(String data, byte[] keyByte) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { byte[] encodedByte = encrypt(data, keyByte); //return new String(Hex.encode(encodedByte));//借助BC //return new String(org.apache.commons.codec.binary.Hex.encodeHexString(encodedByte));//借助CC return Base64.encodeBase64String(encodedByte);//借助CC的Base64编码 } /** * DES解密 * @param data 待解密数据为字节数组 * @param keyByte 密钥 */ public static byte[] decrypt(byte[] data, byte[] keyByte) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { Key key = toKey(keyByte);//还原密钥 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key);//设置解密模式(这是加解密的唯一不同的地方)并且初始化key return cipher.doFinal(data); } /** * DES解密 * @param data 待解密数据为字符串 * @param keyByte 密钥 */ public static byte[] decrypt(String data, byte[] keyByte) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { Key key = toKey(keyByte);//还原密钥 Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key);//设置解密模式(这是加解密的唯一不同的地方)并且初始化key return cipher.doFinal(Base64.decodeBase64(data));//注意data不可以直接采用data.getByte()方法转化为字节数组,否则会抛异常 } /** * 测试 */ public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { String data = "找一个好姑娘做老婆是我的梦 想!"; /*************测试encode()**************/ System.out.println("原文-->"+data); byte[] keyByte = DESJDK.getKey(); System.out.println("密钥-->"+Base64.encodeBase64String(keyByte));//这里将二进制的密钥使用base64加密保存,这也是在实际中使用的方式 byte[] encodedByte = DESJDK.encrypt(data, keyByte); System.out.println("加密后-->"+encodedByte); byte[] encodedByte2 = DESJDK.encrypt(data, keyByte); System.out.println("加密后-->"+encodedByte2); byte[] decodedByte = DESJDK.decrypt(encodedByte, keyByte); System.out.println("解密后-->"+decodedByte); for(int i=0;i<encodedByte.length;i++){ System.out.println(encodedByte[i]==encodedByte2[i]); } /*************测试encodeHmacMD5Hex()**************/ System.out.println("原文-->"+data); byte[] keyByte3 = DESJDK.getKey(); System.out.println("密钥-->"+Base64.encodeBase64String(keyByte3));//这里将二进制的密钥使用base64加密保存,这也是在实际中使用的方式 String encodedStr = DESJDK.encryptDESHex(data, keyByte3); System.out.println("加密后-->"+encodedStr); String encodedByte4 = DESJDK.encryptDESHex(data, keyByte3); System.out.println("加密后-->"+encodedByte4); byte[] decodedByte3 = DESJDK.decrypt(Base64.decodeBase64(encodedStr), keyByte3); System.out.println("解密Byte[]后-->"+decodedByte3); byte[] decodedByte4 = DESJDK.decrypt(encodedStr, keyByte3); System.out.println("解密String后-->"+decodedByte4); } }
注意点:
- 整个算法的过程与Hmac系列算法一样,都是发送方先生成一个密钥(二进制的字节数组),然后发送方将密钥通过安全的途径传给接收方。加解密过程:还原密钥(将二进制的字节数组还原成Java对象),然后根据密钥与待加解密数据进行加解密。
- 加解密算法常量CIPHER_ALGORITHM是一个组合常量,其中的工作模式常用的是ECB和CTR(AES最常用的工作模式),填充模式一般采用PKCS5Padding即可,或者使用BC的PKCS7Padding,具体的工作模式与填充模式的介绍自己去查吧,至于JDK和BC均支持那些工作模式与填充模式直接去查本文最上边的书籍附录即可。
- 初始化密钥长度的时候指定为56(JDK提供56位的密钥,采用BC可以产生64位的密钥)
- 还原密钥的时候没有使用通用的方式SecretKey key = new SecretKeySpec(keyByte, ALGORITHM)来还原(当然也可以使用),而是使用了DES自己的还原类,这是DES的推荐做法,但是在AES中推荐使用通用的方式来还原密钥
- 实际使用中,加密的密文会采用二进制来存储,密钥会采用Base64编码来存储;但是在演示的时候我会提供转化为字符串的密文(转化方法:BC的十六进制转化类 ;CC的十六进制转化类;CC的Base64编码)
- 在解密过程中,如果传入的待解密数据data是String的,在使用dofinal()方法进行加密时,不可以直接使用doFinal(data.getByte()),否则会抛异常;可以使用doFinal(Base64.decodeBase64(data))
- 同一段数据使用统一个密钥无论加密多少次,加密后的密文都相同
第七章 对称加密算法--DES的更多相关文章
- [转] 对称加密算法DES、3DES
转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...
- 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...
- 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。
对称加密算法:DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES. 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文 ...
- 对称加密算法 ~ Des
一.对称加密 (Symmetric Key Encryption) 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret ...
- 对称加密算法DES、3DES和AES 原理总结(转载)
1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...
- 第九章 对称加密算法--IDEA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 9.1.IDEA 特点: 先于AES出来取代DES 安全性极高 常用于电子邮件加密算法 ...
- java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4
概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...
- 对称加密算法-DES以及DESede算法
一.简述 对称加密算法就是能将数据加解密.加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密. DES是美国国家标准研究所提出的算法.因为加解密的数据安全性和密钥长度成正比.des ...
- 计算机网络安全 —— 对称加密算法 DES
一.对称加密算法概念 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换人都不可理解的形式, 从而保证了数据的机密性.这种变换被称为加密 ...
随机推荐
- python platform模块
该模块用来访问平台相关属性. 常见属性和方法 系统名称 platform.system() 返回系统/操作系统名称,例如“Linux”,“Windows” >>> platform. ...
- 系列解读Dropout
本文主要介绍Dropout及延伸下来的一些方法,以便更深入的理解. 想要提高CNN的表达或分类能力,最直接的方法就是采用更深的网络和更多的神经元,即deeper and wider.但是,复杂的网络也 ...
- 在centos7下安装svn
SVN的安装 yum install subversion 服务端命令 1. svnserver - 控制svn系统服务的启动等 2. svnadmin - 版本库的创建/导出/导入/删除等 3. s ...
- [py]flask蓝图的使用
参考 flask挺挺轻巧的, 因此玩一玩它. 如果用它做大型点的项目, 就用到了它的蓝图组织项目. 一时半会不太清楚这玩意怎么用, 得撸一撸py基础了. 我搞了个movie小的flask栗子来用用蓝图 ...
- git客户端msysGit和TortoiseGit使用
windows下使用TortoiseGit代替Git命令行操作(参考http://www.cnblogs.com/candle806/p/4071656.html) 1.配置TortoiseGit与m ...
- git的使用(包括创建远程仓库到上传代码到git的详细步骤以及git的一些常用命令)
A创建远程仓库到上传代码到git 1)登陆或这注册git账号 https://github.com 2)创建远程仓库 3)打开终端输入命令 cd到你的本地项目根目录下,执行如下git命令 git in ...
- 初次使用git上传代码(转)
转自 http://www.cnblogs.com/cxk1995/p/5800196.html 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我 ...
- 持续集成之二:搭建SVN服务器--Apache HTTP Server安装
安装环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80 httpd-2.4.35.tar.gz apr-1.6.5.t ...
- 【R】书籍推荐
From: http://xccds1977.blogspot.com/2013/02/r.html http://www.1point3acres.com/bbs/thread-51301-1-1. ...
- Vert.x
Vert.x是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构.Vert.x基于全异步Java服务器Netty,并扩展出了很多有用的特性. 同时支持多种编程语 ...