AES算法简介(一)

对称加密

  对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
  对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。
  对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

非对称加密

  非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。

AES简介

  高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

密码说明

  严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
  AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“状态(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

  1. AddRoundKey:矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
  2. SubBytes:通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  3. ShiftRows:将矩阵中的每个横列进行循环式移位。
  4. MixColumns:为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。

  最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

加密标准

  AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES 密钥长度(32位比特字) 分组长度(32位比特字) 加密轮数
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

  对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。
  AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。

AES的密钥扩展

  AES密钥扩展算法的输入值是4个字(16字节),输出值是一个由44个字组成(176字节)的一维线性数组。以下伪码描述了这个扩展:

KeyExpansion(byte key[16], word w[44])
{
    word temp
    for(i=0; i<4; i++)  //将输入的密钥直接复制到扩展密钥数组的前四个字
    w[i]=word(key[4*i],key[4*i+1],key[4*i+2],key[4*i+3]);
    temp = w[i-1];
    if(i mod 4 == 0)  //对w数组下标为4的倍数的元素采用更复杂的函数来计算
    temp = SubWord(RotWord(temp))⊕Rcon[i/4];
    w[i] = w[i-4] + temp; //每一个新增的字w[i]依赖于w[i-1] 和w[i-4]
}

  RotWord的功能是字循环,即使一个字的4个字节循环左移1个字节。
  SubWord是利用S盒对输入字的每个字节进行字节代替。
  Rcon[i]是轮常量,代表一个字,这个字最右边三个字节总是0,因此字与Rcon异或,其结果只是与该字最左边的那个字节相异或。每一轮的轮常量都不相同,其定义为:
  Rcon[i] = (RC[i],0,0,0),其中RC[1] = 1,RC[i] = 2•RC[i-1] 乘法是定义在域GF(28)上的。
  RC[i]的值按照十六进制表示为

  轮常量取不同值就是为了消除不同轮密钥产生方式上的对称性或相似性。

密钥扩展算法的设计规范

  1. 找到密钥或轮密钥的部分位不足以计算出轮密钥的其他位;
  2. 它是一个可逆的变换(即知道扩展密钥中任何连续的Nk个字能够重新产生整个扩展密钥,Nk是构成密钥所需的字数);
  3. 能够在各种处理器上有效地执行;
  4. 使用轮常量消除对称性;
  5. 将密钥差异性扩散到轮密钥中的能力,即密钥的每个位能影响轮密钥的许多位;
  6. 足够的非线性以防止轮密钥的差异完全由密钥的差异所决定。

改进–等价的逆算法

  上文所述的标准解密流程与标准加密流程并不完全一致,加密每一轮的流程是:字节代替–>行移位–>列混淆–>轮密加。而解密每一轮的流程是:逆向行移位–>逆向字节代替–>轮密加–>逆向列混淆。
  可以对解密构成进行改进,使得解密流程与加密流程等效。
  1、交换逆向行移位和逆向字节代替:
  由于逆向行移位并不影响state数组中字节的内容,而逆向字节代替也不会影响state数组中字节的位置,因而两者可以交换顺序而不影响解密。
  2、交换轮密钥加和逆向列混淆:
  这两种操作均不会改变state中字节的顺序,给定状态Si和给定轮密钥wi,可证明
  逆向列混淆(Si⊕wi)= [逆向列混淆(Si)]⊕[逆向列混淆(wi)]
  这个等式显然是正确的,因而如果要改变这两种操作的顺序,则必须改进逆向列混淆的操作,即先对轮密钥应用逆向列混淆(注意,无需对首尾的轮密钥应用逆向列混淆)。最终,改进后的解密流程如下图:
AES算法简介(一)_第1张图片

PKCS5Padding、PKCS7Padding 和NO Padding

  PKCS7Padding跟PKCS5Padding的区别就在于数据填充方式,PKCS7Padding是缺几个字节就补几个字节的0,而PKCS5Padding是缺几个字节就补充几个字节的几,好比缺6个字节,就补充6个字节的6 。

分组加密五种加密模式

  分组密码有五种工作体制:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。
  在密码学中,分组密码操作模式是使用分组密码来提供诸如机密性或真实性的信息服务的算法。基于分组的对称密码算法比如DES/AES算法只是描述如何根据秘钥对一段固定长度(分组块)的数据进行加密,对于比较长的数据,分组密码工作模式描述了如何重复应用某种算法加密分组操作来安全地转换大于块的数据量。
  简单的说就是,AES算法描述怎么加密一个数据块,分组密码工作模式决定了如果重复加密比较长的多个数据块。(图片来源Wikipedia)

ECB

  ECB(Electronic Codebook, 电子密码本)模式是最简单的加密模式,明文消息被分成固定大小的块(分组),并且每个块被单独加密。
  每个块的加密和解密都是独立的,且使用相同的方法进行加密,所以可以进行并行计算,但是这种方法一旦有一个块被破解,使用相同的方法可以解密所有的明文数据,安全性比较差。
  适用于数据较少的情形,加密前需要把明文数据填充到块大小的整倍数。
[外链图片转存失败(img-BjxFH3ID-1567082870635)(https://upload.wikimedia.org/wikipedia/commons/d/d6/ECB_encryption.svg)]
[外链图片转存失败(img-zA2AjtBv-1567082870635)(https://upload.wikimedia.org/wikipedia/commons/e/e6/ECB_decryption.svg)]

CBC

  CBC(Cipher Block Chaining, 密码块链)模式中每一个分组要先和前一个分组加密后的数据进行XOR异或操作,然后再进行加密。
  这样每个密文块依赖该块之前的所有明文块,为了保持每条消息都具有唯一性,第一个数据块进行加密之前需要用初始化向量IV进行异或操作。
  CBC模式是一种最常用的加密模式,它主要缺点是加密是连续的,不能并行处理,并且与ECB一样消息块必须填充到块大小的整倍数。
[外链图片转存失败(img-2Q9xWu2b-1567082870635)(https://upload.wikimedia.org/wikipedia/commons/8/80/CBC_encryption.svg)]
[外链图片转存失败(img-KObBOiGi-1567082870636)(https://upload.wikimedia.org/wikipedia/commons/2/2a/CBC_decryption.svg)]

CFB

  CFB(Cipher Feedback, 密码反馈)模式和CBC模式比较相似,前一个分组的密文加密后和当前分组的明文XOR异或操作生成当前分组的密文。CFB模式的解密和CBC模式的加密在流程上其实是非常相似的。
[外链图片转存失败(img-4OKJOCty-1567082870636)(https://upload.wikimedia.org/wikipedia/commons/9/9d/CFB_encryption.svg)]
[外链图片转存失败(img-QqQTiiqZ-1567082870636)(https://upload.wikimedia.org/wikipedia/commons/5/57/CFB_decryption.svg)]

OFB

  OFB(Output Feedback, 输出反馈)模式将分组密码转换为同步流密码,也就是说可以根据明文长度先独立生成相应长度的流密码。通过流程图可以看出,OFB和CFB非常相似,CFB是前一个分组的密文加密后XOR当前分组明文,OFB是前一个分组与前一个明文块异或之前的流密码XOR当前分组明文。由于异或操作的对称性,OFB模式的解密和加密完全一样的流程。
[外链图片转存失败(img-a13ajGmx-1567082870636)(https://upload.wikimedia.org/wikipedia/commons/b/b0/OFB_encryption.svg)]
[外链图片转存失败(img-vuWbUSn5-1567082870637)(https://upload.wikimedia.org/wikipedia/commons/f/f5/OFB_decryption.svg)]

CTR

  CTR(Counter, 计数器)模式与OFB模式一样,计数器模式将分组密码转换为流密码。它通过加密“计数器”的连续值来产生下一个密钥流块。
[外链图片转存失败(img-W8QMLqF9-1567082870637)(https://upload.wikimedia.org/wikipedia/commons/4/4d/CTR_encryption_2.svg)]
[外链图片转存失败(img-bw7z9UNL-1567082870637)(https://upload.wikimedia.org/wikipedia/commons/3/3c/CTR_decryption_2.svg)]

base64

  Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

AES实现

AES加密算法的详细介绍与实现:https://blog.csdn.net/qq_28205153/article/details/55798628
AES/CBC/PKCS5Padding/128(二):https://blog.csdn.net/essity/article/details/86715866

你可能感兴趣的:(Algorithm)