- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AES加密解密运算精选
先搞定AES算法,基本变换包括SubBytes(字节替代)、ShiftRows(行移位)、MixColumns(列混淆)、AddRoundKey(轮密钥加)
其算法一般描述为
明文及密钥的组织排列方式
INCLUDEPICTURE \d /images/2010/169108/2010103100462960.jpg \* MERGEFORMATINET
ByteSubstitution(字节替代)
非线性的字节替代,单独处理每个字节:
求该字节在有限域GF(28)上的乘法逆,0被映射为自身,即对于α∈GF(28),求β∈GF(28),
使得α·β=β·α=1mod(x8+x4+x2+x+1)。
对上一步求得的乘法逆作仿射变换
yi=xi?+ x(i+4)mod8?+ x(i+6)mod8?+ x(i+7)mod8?+ ci
(其中ci是6310即011000112的第i位),用矩阵表示为
INCLUDEPICTURE \d /images/2010/169108/2010103101591769.png \* MERGEFORMATINET
本来打算把求乘法逆和仿射变换算法敲上去,最后还是放弃了...直接打置换表
下面是逆置换表,解密时使用
这里遇到问题了,本来用纯c初始化数组很正常,封装成类以后发现不能初始化,不管是声明、构造函数都无法初始化,百歌谷度了一通后没有任何答案,无奈只能在构造函数中声明一个局部变量数组并初始化,然后用memcpy,(成员变量名为Sbox/InvSbox,局部变量名sBox/invsBox)
ShiftRows(行移位变换)
行移位变换完成基于行的循环位移操作,变换方法:
INCLUDEPICTURE \d /images/2010/169108/2010103102010146.png \* MERGEFORMATINET
即行移位变换作用于行上,第0行不变,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。
MixColumns(列混淆变换)?
?逐列混合,方法:
b(x) = (03·x3?+ 01·x2?+ 01·x + 02) · a(x) mod(x4?+ 1)
INCLUDEPICTURE \d /images/2010/169108/2010103102014940.png \* MERGEFORMATINET
INCLUDEPICTURE \d /images/2010/169108/2010103102021588.png \* MERGEFORMATINET
其中FFmul为有限域GF(28)上的乘法,标准算法应该是循环8次(b与a的每一位相乘,结果相加),但这里只用到最低2位,解密时用到的逆列混淆也只用了低4位,所以在这里高4位的运算是多余的,只计算低4位。
AddRoundKey(轮密钥加变换)?
?简单来说就是逐字节相加,有限域GF(28)上的加法是模2加法,即异或
void?AES::AddRoundKey(unsigned char?state[][4], unsigned char?k[][4])
{
????int?r,c;
????for(c=0; c4; c++)
????{
????????for(r=0; r4; r++)
????????{
????????????state[r][c] ^= k[r][c];
????????}
????}
}
KeyExpansion(密钥扩展)
?将输入的密钥扩展为11组128位密钥组,其中第0组为输入密钥本身?
?其后第n组第i列 为 第n-1组第i列 与 第n组第i-1列之和(模2加法,1= i =3)
INCLUDEPICTURE \d /images/2010/169108/2010103102042294.png \* MERGEFORMATINET
对于每一组 第一列即i=0,有特殊的处理
INCLUDEPICTURE \d /images/2010/169108/2010103102044067.png \* MERGEFORMATINET
将前一列即第n-1组第3列的4个字节循环左移1个字节,
并对每个字节进行字节替代变换SubBytes
将第一行(即第一个字节)与轮常量rc[n]相加?
最后再与前一组该列相加?
void?AES::KeyExpansion(unsigned char* key, unsigned char?w[][4][4])
{
????int?i,j,r,c;
????unsigned char?rc[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0
文档评论(0)