blogSite

我是谁?我在哪儿?我在干什么?

View project on GitHub

AES 算法

简介

  • AES 算法是典型的【对称加密算法】

  • 不同于摘要算法,摘要算法是不可逆的,它的主要作用是对信息一致性和完整性的校验;而对称加密算法是可逆的,它的主要作用是保证私密信息不被泄露。

  • AES 算法全称 Advanced Encryption Standard,是DES算法的替代者,也是当今最流行的对称加密算法之一。

  • AES 算法包含三个基本的概念:密钥、填充、模式。

    1. 密钥

          密钥是AES 算法实现加密和解密的基本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

      AES 算法支持三种长度的密钥:
      
      128位,192位,256位
      

          平时大家所说的 AES128,AES192,AES256,实际上就是指的 AES 算法对不同长度密钥的使用。

          从安全性俩看,AES256安全性最高。从性能来看,AES128性能最高。本质原因是他们的加密处理轮数不同。

    2. 填充

          AES 算法加密是分组加密。

          AES 算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度 128bit。

          这些明文块经过 AES 加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的 AES 加密结果。

      但是这里涉及到一个问题:

      假如一段明文长度是 192bit,如果按每 128bit 一个明文块来拆分的话,第二个明文块只有 64bit,不足 128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

      AES 再不同的语言实现中有许多不同的填充算法

      NoPadding:
      
      不做任何填充,但是要求明文必须是 16 字节的整数倍。
      
      PKCS5Padding(默认):
      
      如果明文块少于 16 个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。
      
      比如明文:{1,2,3,4,5,a,b,c,d,e}, 缺少 6 个字节,则补全为 {1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
      
      ISO10126Padding:
      
      如果明文块少于 16 个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。
      
      比如明文:{1,2,3,4,5,a,b,c,d,e}, 缺少 6 个字节,则可能补全为 {1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
      
      ZeroPadding:
      
      数据长度不对齐时使用0填充,否则不填充。使用0填充有个缺点,当元数据尾部也存在0时,在unpadding时可能会存在问题。
      
      PKCS7Padding
      
      假设每个区块大小为blockSize
      <1> 已对齐,填充一个长度为blockSize且每个字节均为blockSize的数据。
      <2> 未对齐,需要补充的字节个数为n,则填充一个长度为n且每个字节均为n的数据。
      
      PKCS5Padding是PKCS7Padding的子集,只是块大小固定为8字节。所以两者的区别在于PKCS5Padding是限制块大小的PKCS7Padding。
      

      需要注意的是,如果AES加密的时候使用了某一种填充方式,解密的时候也必须采用同样的填充方式。

    3. 模式

      AES 的工作模式,体现在把明文块加密成密文块的处理过程中。AES 加密算法提供了五种不同的工作模式:

      ECB、CBC、CTR、CFB、OFB

      模式之间的主题思想是近似的,在处理细节上有一些差别。我们这一期只介绍各个模式的基本定义。

      ECB 模式(默认): 电码本模式 Electronic Codebook Book

      CBC 模式: 密码分组链接模式 Cipher Block Chaining

      CTR 模式: 计算器模式 Counter

      CFB 模式: 密码反馈模式 Cipher FeedBack

      OFB 模式: 输出反馈模式 Output FeedBack

      通样的,如果在AES加密的时候使用了某一种工作模式,解密的时候也必须采用通样的工作模式。

      AES 算法在Java的javax.crypto包里有很好的封装。

      Cipher.getInstance("AES/CBC/NoPadding") // 决定了 AES 选择的填充方式是 NoPadding,工作模式是 CBC 模式。
      

    补充

    1. 我们在调用封装好的 AES 算法时,表面上使用的 Key 并不是真正用于 AES 加密解密的密钥,而是用于生成真正密钥的 “种子”。

    2. 填充明文时,如果明文长度原本就是 16 字节的整数倍,那么除了 NoPadding 以外,其他的填充方式都会填充一组额外的 16 字节明文块

参考文档

首页 > 学习总览 > 开发相关算法 > 加密解密算法