1. 相关概念
- 加密和解密的密钥是一样的
- 加解密速度较快,可以在数据较大时使用
- 一定要保证密钥的安全
- 加密过程:密文 = 运算过程(原文,密钥,工作模式,填充模式)
- 加密参数:密钥、工作模式、填充模式
- 不同算法的密钥长度不一样,长度越长,安全性越高
- 工作模式,也就是加密运算的过程,比如有ECB(电子密码本模式)、CBC(密码分组链接)、CFB(密文反馈模式)、OFB(输出反馈模式)等
- 填充模式,运算过程中出现位数不足时,如何进行补全
2. 常见算法
- DES 因为密钥较短,极易被破解,一般极少使用
- 3DES 基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高
- AES 高级加密标准,是下一代加密算法标准,速度快,安全极别高,推荐使用
3. 代码示例
上面提到,工作模式不同,运算的过程也是不一样的,当然代码实现也是不一样的,下面分别介绍
- ECB模式
import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
String content = "abc"; //原文
String encryptKey = "1234567890ABCDEF"; //16字节,128位密钥
//加密
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); //设置算法、工作模式、填充模式
SecretKey key = new SecretKeySpec(encryptKey.getBytes(),"AES");
cipher.init(Cipher.ENCRYPT_MODE, key); //加密模式
byte[] encryptBytes = cipher.doFinal(content.getBytes("UTF-8")); //得到加密的信息
System.out.println("encrypt data:" + Base64.getEncoder().encodeToString(encryptBytes));
//WRsSrNWboZEAWOh27H9ziw==
//解密
Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKey key1 = new SecretKeySpec(encryptKey.getBytes(),"AES");
cipher1.init(Cipher.DECRYPT_MODE, key1); //解密信息
byte[] decryptBytes1 = cipher1.doFinal(encryptBytes); //得到原文
System.out.println("decrypt data:" + new String(decryptBytes1,"UTF-8"));
//abc
- CBC模式
import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
String content = "abc";
String encryptKey = "1234567890ABCDEF";
//加密
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKey key = new SecretKeySpec(encryptKey.getBytes(),"AES");
//生成16字节的iv参数,提高安全性
SecureRandom sr = SecureRandom.getInstanceStrong();
byte[] iv = sr.generateSeed(16);
IvParameterSpec ivps = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivps);
byte[] encryptBytes = cipher.doFinal(content.getBytes("UTF-8"));
System.out.println("encrypt data:" + Base64.getEncoder().encodeToString(encryptBytes));
//2+3Ju+DF4gwd1bDqs3UrhQ==
//注:因为有随机码的存在,所以每次生成的结果也不是相同的,较安全
//解密
Cipher cipher1 = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKey key1 = new SecretKeySpec(encryptKey.getBytes(),"AES");
cipher1.init(Cipher.DECRYPT_MODE, key1,ivps);
byte[] decryptBytes1 = cipher1.doFinal(encryptBytes);
System.out.println("decrypt data:" + new String(decryptBytes1,"UTF-8"));
//abc
上面iv参数因为是随机产生的,本身不需要保密,可以跟着密文一起返回,解密时可以提取出来备用
网友评论