AES简介

AES, Advanced Encryption Standard,其实是一套标准:FIPS 197,而我们所说的AES算法其实是Rijndael算法。

NIST (National INstitute of Standards and Technology) 在1997年9月12日公开征集更高效更安全的替代DES加密算法,第一轮共有15种算法入选,其中5种算法入围了决赛,分别是MARS,RC6,Rijndael,Serpent和Twofish。又经过3年的验证、评测及公众讨论之后Rijndael算法最终入选。

Rijndael算法

Rijndael算法是由比利时学者Joan Daemen和Vincent Rijmen所提出的,算法的名字就由两位作者的名字组合而成。Rijndael的优势在于集安全性、性能、效率、可实现性及灵活性与一体。Rijndael算法是基于代换-置换网络(SPN,Substitution-permutation network)的迭代算法。

AES vs Rijndael

Rijndael算法支持多种分组及密钥长度,介于128-256之间所有32的倍数均可,最小支持128位,最大256位,共25种组合。而AES标准支持的分组大小固定为128位,密钥长度有3种选择:128位、192位及256位。

AES加密数据块大小最大是256bit,但是密钥大小在理论上没有上限。AES加密有很多轮的重复和变换。大致步骤如下:

1. 密钥扩展(KeyExpansion)

2. 初始轮(Initial Round)

3. 重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey

4. 最终轮(Final Round),最终轮没有MixColumns。

如果需要加密的数据不是128bits(16Bytes)的倍数的话,需要利用到数据扩张:AES支持支持几种填充,NoPadding,PKCS5Padding,ISO10126Padding,PaddingMode.Zeros,PaddingMode.PKCS7。注意一定要是16个数据(1个数据是8位,这样就是128位)这样才能进行AES加密。如果刚满16个,那就要在补充称16个字节。一定要比原先的多。(每种补充都要满足这样。这里非常容易被忽略)。这样再代入加密算法才是最正直的AES。

举例:如果{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},PaddingMode.Zeros模式,就要补充称{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};PKCS7Padding模式就要{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16}.
 

文章推荐

1、Rijndael算法概述

,本篇文章非常清晰地概述了Rijndael算法的加密、解密过程,让读者能快速了解,Rijndael的加密、解密过程是怎样的

https://www.jianshu.com/p/3840b344b27c,,http://www.moserware.com/2009/09/stick-figure-guide-to-advanced.html,3篇文章描述详细清楚,有逻辑,极力推荐。存在借鉴关系。

TODO:

1)SubByte阶段的替换表是如何得到的?即S盒(置换盒)是怎么来的?置换规则是什么?以字节为单位数学运算(S盒是对称加密进行置换计算的基本结构,S盒的强度直接决定了该对称加密算法的好坏)

2)MixColumns阶段的矩阵运算是怎样运算的?采用模不可约多项式。什么是模不可约多项式?以字节列为单位进行数学运算

3)密钥扩展第二步用到的置换盒和第1)中的置换盒是一个吗?是一个,同样的数学运算规则

4)密钥扩展第三步提的轮常量是哪里来的?轮常量每一轮都不同?从1开始不断乘以X,数学运算

5)轮数的规则?为了满足雪崩效应,什么是雪崩效应?

2、分组密码的模式

,本篇文章列出了一些概念以及分组密码的模式

,本篇文章是对五大分组加密模式的解释以及加密和解密图解,比较清晰易懂

一 分组密码和流密码

分组密码:每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组。一个分组的比特数称为分组长度。对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。

举例:DES和3DES的分组长度都是64bit。这些密码一次只能加密64bit的明文,并生成64bit的密文。AES的分组长度时128bit,因此AES一次可加密128bit的明文,并生成128bit的密文。

流密码:对数据流进行连续处理的一类密码算法。流密码中一般以1bit、8bit或32bit等为单位进行加密和解密。

举例:一次性密码本属于流密码。

二 什么是模式

分组密码算法只能加密固定长度的分组,但是需要加密的明文可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式。基于分组的对称密码算法比如DES/AES算法只是描述如何根据秘钥对一段固定长度(分组块)的数据进行加密,对于比较长的数据,分组密码工作模式描述了如何重复应用某种算法加密分组操作来安全地转换大于的数据量。简单的说就是,AES算法描述怎么加密一个数据块,分组密码工作模式描述了如何重复加密比较长的多个数据块。

分组密码主要有以下5种模式:

ECB模式:Electronic CodeBook mode(电子密码本模式)

ECB(Electronic Codebook, 电子密码本)模式是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被破解,使用相同的方法可以解密所有的明文数据,安全性比较差。适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。

 

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

CBC(Cipher Block Chaining, 密码块链)模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量IV(Initialization Vector)进行异或操作。CBC模式是一种最常用的加密模式,它主要缺点是加密是连续的,不能并行处理,并且与ECB一样消息块必须填充到块大小的整倍数。
 

CFB模式:Cipher FeedBack mode(密码反馈模式)

CFB(Cipher Feedback, 密码反馈)模式和CBC模式比较相似,前一个分组的密文加密后和当前分组的明文XOR异或操作生成当前分组的密文。CFB模式的解密和CBC模式的加密在流程上其实是非常相似的。

 

OFB模式:Output FeedBack mode(输出反馈模式)

OFB(Output Feedback, 输出反馈)模式将分组密码转换为同步流密码,也就是说可以根据明文长度先独立生成相应长度的流密码。通过流程图可以看出,OFB和CFB非常相似,CFB是前一个分组的密文加密后XOR当前分组明文,OFB是前一个分组与前一个明文块异或之前的流密码XOR当前分组明文。由于异或操作的对称性,OFB模式的解密和加密完全一样的流程。
 

CTR模式:CounTeR mode(计数器模式)

CTR(Counter, 计数器)模式与OFB模式一样,计数器模式将分组密码转换为流密码。它通过加密“计数器”的连续值来产生下一个密钥流块

 

注意:异或操作具有对称性。为什么用异或操作?原因很简单,异或快而且开销少–很快的位运算。异或运算使用简单的硬件而且可以并行计算因为没有多余的为需要参与运算。

三 明文分组和密文分组

明文分组:指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度时相等的。

密文分组:指分组密码算法将明文加密之后生成的密文。

声明:本文内容参考文中连接内容