Java 对称加密DES、3DES、AES 算法

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、加解密通信模型

如下图

image

二、常用单向加密算法及实现代码

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日,今天马云正式宣布,辞任阿里巴巴董事局主席。江湖再见~~

原文地址:https://www.cnblogs.com/cnsyear/p/12732133.html