文首声明:本文不讲算法实现
AES介绍
AES算法是一种典型的对称加密算法,不同于md5这种摘要算法是不可逆的,AES是可以通过秘钥解密的,一般用于对私密信息的保密。
md5算法一般用文件的完整性校验,可以根据文件的所有的字节生成一个md5,也经常用于登录的鉴权,将密码的md5值存于数据库,登录时比较前端输入的密码的md5值和数据库的md5值。
AES算法中有三个重要的定义:秘钥,加密模式,填充
秘钥
AES通过秘钥加解密,支持128位,192位,256位秘钥长度,也就是平时说的AES128,AES192,AES256,秘钥越长效率越低,保密性越强。
填充
AES算法加密时会将明文拆分成128bit的数据块,分别进行加密,也就是如果明文长度非128bit的整数倍则必出现不满128bit的数据块,填充就是在此时起作用的,填充方式如下。
NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍。
PKCS5Padding(默认):如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。
ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。
模式
AES的加密模式体现在加密的处理,总共五种。
CBC模式:电码本模式 Electronic Codebook Book
ECB模式(默认):密码分组链接模式 Cipher Block Chaining
CTR模式:计算器模式 Counter
CFB模式:密码反馈模式 Cipher FeedBack
OFB模式:输出反馈模式 Output FeedBack
加解密必须使用相同的模式和填充方式
JAVA实现
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Decoder;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.cr