Java 对称加密DES、3DES、AES 算法
一、对称加密算法
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。(by 百度百科)
1、常用算法
在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。
2、算法特征
- 1、加密方和解密方使用同一个密钥;
- 2、加密解密的速度比较快,适合数据比较长时的使用;
- 3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦;
3、加密工具
- 1、openssl,它使用了libcrypto加密库、libssl库即TLS/SSL协议的实现库等。TLS/SSL是基于会话的、实现了身份认证、数据机密性和会话完整性的TLS/SSL库。openssl官网。
- 2、gpg
4、优缺点
对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的独一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
5、加解密通信模型
如下图
二、常用单向加密算法及实现代码
1、DES(Data Encryption Standard)
数据加密标准,速度较快,适用于加密大量数据的场合;
特点:密钥偏短(56位)、生命周期短(避免被破解);
Java实现:
1)生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("DES");//密钥生成器
keyGen.init(56);//初始化密钥生成器
SecretKey secretKey = keyGen.generateKey();//生成密钥
byte[] key = secretKey.getEncoded();//密钥字节数组
2)加密
SecretKey secretKey = new SecretKeySpec(key, "DES");//恢复密钥
Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作类
cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,加密模式
byte[] cipherByte = cipher.doFinal(data);//加密data
3)解密
SecretKey secretKey = new SecretKeySpec(key, "DES");//恢复密钥
Cipher cipher = Cipher.getInstance("DES");//Cipher完成加密或解密工作类
cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//解密data
2、3DES(Triple DES)
基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
缺点:处理速度较慢、密钥计算时间较长、加密效率不高
Java实现:
1)生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("DESede");//密钥生成器
keyGen.init(168); //可指定密钥长度为112或168,默认为168
SecretKey secretKey = keyGen.generateKey();//生成密钥
byte[] key = secretKey.getEncoded();//密钥字节数组
2)3DES加密
SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢复密钥
Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作类
cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//加密data
3)3DES解密
SecretKey secretKey = new SecretKeySpec(key, "DESede");//恢复密钥
Cipher cipher = Cipher.getInstance("DESede");//Cipher完成加密或解密工作类
cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//解密data
3、AES(Advanced Encryption Standard)
高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;
特点:密钥建立时间短、灵敏性好、内存需求低、安全性高
1)生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");//密钥生成器
keygen.init(128); //默认128,获得无政策权限后可为192或256
SecretKey secretKey = keyGen.generateKey();//生成密钥
byte[] key = secretKey.getEncoded();//密钥字节数组
2)AES加密
SecretKey secretKey = new SecretKeySpec(key, "AES");//恢复密钥
Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作类
cipher.init(Cipher.ENCRYPT_MODE, secretKey);//对Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//加密data
3)AES解密
SecretKey secretKey = new SecretKeySpec(key, "AES");//恢复密钥
Cipher cipher = Cipher.getInstance("AES");//Cipher完成加密或解密工作类
cipher.init(Cipher.DECRYPT_MODE, secretKey);//对Cipher初始化,解密模式
byte[] cipherByte = cipher.doFinal(data);//解密data
注意:
- 1、秘钥key的长度,不能随便一个String
- 2、生成出的密文存在乱码,这是正常现象,解决方法再将密文进行base64编码,解密时先base64解码
三、使用Hutool工具类
Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。Hutool最初是我项目中“util”包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集。
绝不重复造轮子,使用Hutool-crypto。
加密分为三种:
- 对称加密(symmetric),例如:AES、DES等
- 非对称加密(asymmetric),例如:RSA、DSA等
- 摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等
hutool-crypto针对这三种加密类型分别封装,并提供常用的大部分加密算法。
1、添加POM依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.3</version>
</dependency>
2、DES加密示例
package cn.pconline;
import cn.hutool.crypto.SecureUtil;
public class Test {
public static void main(String[] args) {
// DES 加密示例
String cookieKey = "HutoolHutoolHutoolHutool";
String value = "Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。";
//加密
byte[] desValue1 = SecureUtil.desede(cookieKey.getBytes()).encrypt(value.getBytes());
System.out.println(new String(desValue1));
//解密
System.out.println(SecureUtil.desede(cookieKey.getBytes()).decryptStr(desValue1));
//加密
//自带base64编码方法
String desValue2 = SecureUtil.desede(cookieKey.getBytes()).encryptBase64(value.getBytes());
System.out.println(desValue2);
//解密
System.out.println(SecureUtil.desede(cookieKey.getBytes()).decryptStr(desValue2));
/*
hluTqr/nDL/QTxWo4d47yWLjSFqY/WS14Muv9XrPp6V/1j/pcqIF8XIeGod8woyrNxkWCQgEH7Iw5xFiV77bhgent8Mj4i7EgwIvH8J1D3aRLFBseqv7WgKHUdPJNMmD/zG+BAR0xijKFQkXQg5AlvIYNiWNQI1umCMMeKtA4P6Gsmg8WBAioJYD23WLYmfRJlJ7LHnf0cKAfHPF0YytE/kXnugoTrJ2
Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。
*/
}
}
原文链接:
http://blog.csdn.net/smartbetter/article/details/54017759
PS: 9月10日,今天马云正式宣布,辞任阿里巴巴董事局主席。江湖再见~~