AES(高级加密标准)

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 —(使用 ** KAES 加密函数处理)—> 密文 C

解密密文 C —(使用 ** KAES 解密函数处理)—> 明文 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
** [email protected]
初始化向量 luanlaibuyaomofa
密文类型 Base64
明文 今天晚上12点#天台第二个花盆下面#放着两个地址#连线的中点是见面地点#只需两个人见面#不要报999#有内鬼!终止交易!#...#
密文 TM7UzTfjNAQF2j3qkMHrgkkw1AG/67KC7Borth0OyAS9hroGGFhW1JeSUXrDMZJ1uAR26pMHhefKvgEdqg+f36QYLQR5MM+T1QGdI/TFUZ/ktobmfL9bJmejYqhZkH5UqdZpi27t6d9rMMJ+6htjZzqRcS4tpYFFbmx7E2TDHcqteNlFi77Z36s4wdU5Iugx7/PwKwBPwpqvNJwLvvH7nPY8r9fOuV/+1o6H55l/r3o=

private static final String key = "[email protected]";            // **
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;
    }
}

结果如图:

AES(高级加密标准)

AES(高级加密标准)

参考资料

标题 链接
高级加密标准 https://zh.wikipedia.org/wiki/高级加密标准
分组密码工作模式 https://zh.wikipedia.org/wiki/分组密码工作模式
初始向量 https://zh.wikipedia.org/wiki/初始向量
填充 https://zh.wikipedia.org/wiki/填充_(密码学)