- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AES加密解密运算
先搞定AES算法,基本变换包括SubBytes(字节替代)、ShiftRows(行移位)、MixColumns(列混淆)、AddRoundKey(轮密钥加)其算法一般描述为明文及密钥的组织排列方式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位),用矩阵表示为本来打算把求乘法逆和仿射变换算法敲上去,最后还是放弃了...直接打置换表下面是逆置换表,解密时使用这里遇到问题了,本来用纯c初始化数组很正常,封装成类以后发现不能初始化,不管是声明、构造函数都无法初始化,百歌谷度了一通后没有任何答案,无奈只能在构造函数中声明一个局部变量数组并初始化,然后用memcpy,(成员变量名为Sbox/InvSbox,局部变量名sBox/invsBox)ShiftRows(行移位变换)行移位变换完成基于行的循环位移操作,变换方法:即行移位变换作用于行上,第0行不变,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。MixColumns(列混淆变换)??逐列混合,方法:b(x) = (03·x3?+ 01·x2?+ 01·x + 02) · a(x) mod(x4?+ 1)其中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)对于每一组第一列即i=0,有特殊的处理将前一列即第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, 0x80, 0x1b, 0x36};????for(r=0; r4; r++)????{????????for(c=0; c4; c++)????????{????????????w[0][r][c] = key[r+c*4];????????}????}????for(i=1; i=10; i++)????{????????for(j=0; j4; j++)????????{????????????unsigned char?t[4];????????????for(r=0; r4; r++)????????????{????????????????t[r] = j ? w[i][r][j-1] : w[i-1][r][3];????????????}????????????if(j == 0)????????????{????????????????unsigned char?temp = t[0];????????????????for(r=0; r3; r++)????????????????{????????????????????t[r] = Sbox[t[(r+1)%4]];????????????????}????????????????t[3] = Sbox[temp];????????????????t[0] ^= rc[i-1];????????????}????????????for(r=0; r4; r
文档评论(0)