【密码学系列】 || 揭秘AES算法的神秘之处!

2020-04-07  本文已影响0人  i小玉
微信公众号:龙跃十二
持续更新,欢迎关注!

用心分享,共同成长

没有什么比你每天进步一点点更实在了

本文已经收录至我的GitHub,欢迎大家踊跃star🌟。
GitHub
哎,在这一周被迫营业的日子里呢,发生了一些让人匪夷所思、琢磨不透的事情,你说我这么一个女孩子,除了看过李佳琪的直播,还没着迷过别的男主播,这不,梦想照进现实,是什么逼迫我的老师们也成了主播,而我成了在直播间刷礼物的<font face="黑体" color=orange size=3>精神小伙</font>。

<img src="https://tva1.sinaimg.cn/large/00831rSTly1gci2h5o0daj307s06v3yl.jpg" style="zoom:67%;" />

虽然学校得要正常营业,但是日常输出也必不可少,今天分享的是一个对于密码学界来说非常重要的算法,这么说你是不是还是体会不到它的重要性,那就比如说,它就像是口红里的Dior,包包里的爱马仕......不说了,钱包疼

AES算法:(Advanced Encryption Standard)

🌟介绍:

AES(Advanced Encryption Standard)算法,高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

在对 AES 设计之初呢,就有三个基本要求:

对DES还有疑问的朋友可以看看我之前的文章 聊聊密码学中的DES算法二重DES、三重DES详解

🌟说明:

其实,从严格意义上讲,AES和Rijndael加密法又不完全一样,但是在实际应用中,我们常常将两者交换使用。

我们来看一组对比数据:

相对于AES来说,Rijndael算法使用更加不受约束。Rijndael算法可以支持更大范围的分组长度和密钥长度。

类似于明文分组和密文分组,算法的中间结果也须分组,将这种分组成为“状态”, 所有的操作都在状态上进行。例如:AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵就称为“状态”,其初值就是一个明文分组(矩阵中一个元素大小就是明文分组中的一个Byte)。对于Rijndael算法来说,其加密时明文分组长度不定,其矩阵的大小需要根据具体情况来定。

加密时,AES算法的加密过程都包含4个步骤:

最后一个加密循环中略微有所不同。

综上所述,组成 Rijndael 轮函数的计算部件简捷快速,功能互补。轮函数的伪 C 代码如下:

Round (State , RoundKey) 
{ 
ByteSub (State ) ; 
ShiftRow (State ) ; 
MixColumn (Sta te) ; 
AddRoundKey (State , RoundKey) 
}

最后一个加密循环的轮函数与前面各轮不同,需要将 MixColumn 这一步去掉,其伪 C 代码如下:

FinalRound ( State , RoundKey) 
{ 
ByteSub (State ) ; 
ShiftRow (State ) ; 
AddRoundKey (State , RoundKey) 
}

注:在以上伪 C 代码记法中, State、RoundKey 可用指针类型,函数 Round、FinalRound、 ByteSub、Shift Row、MixColumn、AddRoundKey 都在指针 State、RoundKey 所指向的阵列上进行运算。

加密标准:

AES为分组密码,在加密时需要把明文分成长度相等的小组,每次对一组数据进行加密。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。AES的密钥长度可以是128bit、192bit或256bit。密钥的长度不同,所需要的加密轮数也会不相同,具体情况如下图所示:

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

密钥编排

密钥编排指从种子密钥得到轮密钥的过程, 它由密钥扩展和轮密钥选取两部分组成。

其基本原则如下:

加密算法:

加密算法的操作顺序:初始的密钥加,( Nr-1) 轮迭代,一个结尾轮。即:

Rijndael (State , Ciphe rKey) 
{ 
KeyExpansion (Ciphe rKey , ExpandedKey) ; 
AddRoundKey (State , ExpandedKey) ; 
for ( i=1; i< Nr; i++) Round (State , ExpandedKey + Nb*i) ;
FinalRound (State, ExpandedKey + Nb*Nr)
} 

其中 CipherKey 是种子密钥,ExpandedKey 是扩展密钥。密钥扩展可以事先进行 ( 预算) ,且 Rijndael 密码的加密算法可以用这一扩展密钥来描述, 即 :

Rijndael (State , ExpandedKey) 
{ 
AddRoundKey (State , ExpandedKey) ; 
for ( i=1; i< Nr ; i++) Round (State , ExpandedKey+Nb*i) ;
FinalRound (State, ExpandedKey + Nb*Nr)
}

解密算法:

解密算法的操作顺序: 初始的密钥加,( Nr-1) 轮迭代, 一个结尾轮。

其中解密算法的轮函数为 :

InvRound (Sta te, RoundKey) 
{ 
InvByteSub ( State ) ; 
InvShiftRow ( State ) ; 
InvMixColumn (State ) ; 
AddRoundKey (State , RoundKey) 
} 

解密算法的结尾轮为 :

InvFinalRound (State, RoundKey) 
{ 
InvByteSub ( State ) ; 
InvShiftRow ( State ) ; 
AddRoundKey (State , RoundKey) 
}

关于AES算法最主要的就是要明白它的加密步骤,明文分组,以及密钥的使用,给大家贴了很多关于轮函数在AES算使用所需的代码块,需要的小伙伴自取哦!

关于文章中有任何问题,都可以关注公众号【龙跃十二】,在后台联系作者!

上一篇 下一篇

猜你喜欢

热点阅读