AES(高级加密标准)
AES 简介
高级加密标准(英语Advanced Encryption Standard,缩写AES)在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于 2001 年 11 月 26 日发布于 FIPS PUB 197,并在 2002 年 5 月 26 日成为有效的标准。2006 年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
该算法为比利时密码学家 Joan Daemen 和 Vincent Rijmen 所设计,结合两位作者的名字,以 Rijndael 为名投稿高级加密标准的甄选流程。(Rijndael 的发音近于 "Rhine doll")
对称加密
AES 属于对称加密算法
简单的加密解密过程如下:
加密:明文 P —(使用密钥 K,AES 加密函数处理)—> 密文 C
解密:密文 C —(使用密钥 K,AES 解密函数处理)—> 明文 P
各部分介绍:
名称 | 描述 |
---|---|
明文 P | 未经加密的数据 |
密钥 K | 加密明文所用的密码。在对称加密算法中,加密和解密的密钥是相同的。所在在使用对称加密算法时,注意保护密钥。 |
密文 C | 加密处理后的数据 |
AES 加密函数 | 通过输入 明文 和 密钥,进行 AES 加密输出密文 |
AES 解密函数 | 通过输入 密文 和 密钥,进行 AES 解密输出明文 |
从上面过程简单理解对称加密,就是加密和解密过程都是用相同的密钥。
而非对称加密,则是加密和解密过程使用不同的密钥。
对比如下:
对称加密 | 非对称加密 | |
---|---|---|
常见例子 | DES、AES | RSA |
优点 | 效率高,速度快,适合大数据的加密 | 安全性高(各自保存私钥、公钥,不需要将私钥分给别人) |
缺点 | 密钥管理和分发困难,密钥管理负担重 | 加密解密速度慢,效率低,只适合少量数据加密的场景 |
AES 特点
项目 | 说明 | 备注 |
---|---|---|
密钥长度 | 128位(16Byte)、192位(24Byte)、256位(32Byte) | 默认:128位 |
分组密码工作模式 | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8 至 CFB128,OFB,OFB8 至 OFB128 | |
填充方式 | NoPadding, ISO10126Padding, OAEPPadding, PKCS1Padding, PKCS5Padding, SSL3Padding |
采用不同的工作模式(分组密码工作模式),可能会涉及到 初始化向量(IV) 和 填充模式 的选择。
在密码学中,一个密钥只能加密长度等于密钥长度的数据。
为了加密更多的数据,需要对数据进行合理的分组。
分组密码工作模式则是按照不同的密码规则进行分组(用于加密和认证)。
最后一块数据长度不足密钥长度时,则需要使用合适的 填充模式 进行填充,然后加入处理。
分组过程中通常还会加入初始化向量进行随机化,以保证安全。
Java 实现 AES 加密
Java 中支持的分组密码工作模式:
- NONE
- CBC
- CCM
- CFB, CFBx
- CTR
- CTS
- ECB
- GCM
- OFB, OFBx
- PCBC
支持的填充模式:
- NoPadding
- ISO10126Padding
- OAEPPadding
- PKCS1Padding
- PKCS5Padding
- SSL3Padding
测试代码数据/配置如下:
配置 | |
---|---|
编码 | UTF-8 |
加密算法 | AES |
分组密码工作模式 | CBC |
填充模式 | PKCS5Padding |
密钥 | _zone_@2019.code |
初始化向量 | luanlaibuyaomofa |
密文类型 | Base64 |
明文 | 今天晚上12点#天台第二个花盆下面#放着两个地址#连线的中点是见面地点#只需两个人见面#不要报999#有内鬼!终止交易!#...# |
密文 | TM7UzTfjNAQF2j3qkMHrgkkw1AG/67KC7Borth0OyAS9hroGGFhW1JeSUXrDMZJ1uAR26pMHhefKvgEdqg+f36QYLQR5MM+T1QGdI/TFUZ/ktobmfL9bJmejYqhZkH5UqdZpi27t6d9rMMJ+6htjZzqRcS4tpYFFbmx7E2TDHcqteNlFi77Z36s4wdU5Iugx7/PwKwBPwpqvNJwLvvH7nPY8r9fOuV/+1o6H55l/r3o= |
private static final String key = "_zone_@2019.code"; // 密钥
private static final String iv = "luanlaibuyaomofa"; // 初始化向量
private static final String ALGORITHM_NAME = "AES"; // 使用 AES 加密
private static final String DEFAULT_MODE = "CBC"; // 分组密码工作模式
private static final String DEFAULT_PADDING = "PKCS5Padding"; // 填充模式
private static final String DEFAULT_ENCODE = "UTF-8"; // 文本编码
private static final String DEFAULT_CHIPHER_INSTANCE = ALGORITHM_NAME+"/"+DEFAULT_MODE+"/"+DEFAULT_PADDING; // AES/CBC/PKCS5Padding
private static String CipherMode = DEFAULT_CHIPHER_INSTANCE;
private static IvParameterSpec getIvParameterSpec(String iv) {
final int MAX_SIZE = 16;
if (iv == null) {
iv = "";
}
byte[] data = new byte[MAX_SIZE];
byte[] data_str = iv.getBytes();
for (int i = 0, len = data_str.length; i < MAX_SIZE; ++i) {
data[i] = (i < len) ? data_str[i] : 0;
}
return new IvParameterSpec(data);
}
public String encrypt_base64(String key, String data) throws Exception {
try {
Cipher cipher = Cipher.getInstance(CipherMode);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), ALGORITHM_NAME);
cipher.init(Cipher.ENCRYPT_MODE, keyspec, getIvParameterSpec(iv));
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.encodeToString(encrypted, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String decrypt_base64(String key, String data) throws Exception {
try {
byte[] encrypted = Base64.decode(data.getBytes(), Base64.DEFAULT);
Cipher cipher = Cipher.getInstance(CipherMode);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), ALGORITHM_NAME);
cipher.init(Cipher.DECRYPT_MODE, keyspec, getIvParameterSpec(iv));
byte[] original = cipher.doFinal(encrypted);
return new String(original, DEFAULT_ENCODE);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
结果如图:
![](https://img.haomeiwen.com/i14530423/2148c0a76d2c195c.png)
![](https://img.haomeiwen.com/i14530423/13c48de640297e0f.png)
参考资料
标题 | 链接 |
---|---|
高级加密标准 | https://zh.wikipedia.org/wiki/高级加密标准 |
分组密码工作模式 | https://zh.wikipedia.org/wiki/分组密码工作模式 |
初始向量 | https://zh.wikipedia.org/wiki/初始向量 |
填充 | https://zh.wikipedia.org/wiki/填充_(密码学) |
网友评论