密码学 AES算法实现 c语言

基础知识: 

密码学 AES算法实现 c语言_第1张图片

最后轮没有列混合

初始变换:

    明文4*4=16字节=128bit 密钥4*4=128bit

    明文和初始密钥 异或

字节代换

S-Box

密码学 AES算法实现 c语言_第2张图片

行移位

密码学 AES算法实现 c语言_第3张图片

 列混合

密码学 AES算法实现 c语言_第4张图片

密码学 AES算法实现 c语言_第5张图片

乘法

2 左移1位且分为当首位为0时;当首位为1 两种情况

3 3拆为2+1

4 4拆为2*2

轮密钥加

子密钥获得(密钥扩展)

密码学 AES算法实现 c语言_第6张图片

密码学 AES算法实现 c语言_第7张图片

密码学 AES算法实现 c语言_第8张图片

密码学 AES算法实现 c语言_第9张图片

AES算法主要包括以下几个部分:s盒模型,密钥扩充,轮密钥加,字节代换,行移位,列混合。

而本文主要讨论AES-128,进行10轮迭代,在第10轮时少一次列混合。

(1)密钥扩充

    AES首先将初始密钥输入到一个4*4的状态矩阵,这个4*4矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为W[0]、W[1]、W[2]和W[3],它们构成一个以字为单位的数组W。例如,设密钥K为”abcdefghijklmnop”,则K0 = ‘a’,K1 = ‘b’, K2 = ‘c’,K3 = ‘d’,W[0] = “abcd”。 
    接着,对W数组扩充40个新列,构成总共44列的扩展密钥数组。新列以如下的递归

方式产生: 
    1.如果i不是4的倍数,那么第i列由如下等式确定: W[i]=W[i-4]W[i-1] 
    2.如果i是4的倍数,那么第i列由如下等式确定: W[i]=W[i-4]T(W[i-1]) 
    其中,T是一个有点复杂的函数。 
    函数T由3部分组成:字循环、字节代换和轮常量异或,这3部分的作用分别如下。 
    a.字循环:将1个字中的4个字节循环左移1个字节。即将输入字[b0, b1, b2, b3]变换成[b1,b2,b3,b0]。 
    b.字节代换:对字循环的结果使用S盒进行字节代换。 
    c.轮常量异或:将前两步的结果同轮常量Rcon[j]进行异或,其中j表示轮数。

密码学 AES算法实现 c语言_第10张图片

(2)字节代换

    AES的字节代换其实就是一个简单的查表操作。状态矩阵中的元素按照下面的方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。

(3)行移位

    行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节

密码学 AES算法实现 c语言_第11张图片

(4)列混合

    列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:

 密码学 AES算法实现 c语言_第12张图片

 密码学 AES算法实现 c语言_第13张图片

 矩阵元素的乘法和加法都是定义在基于GF(2^8)上的二元运算,并不是通常意义上的乘法和加法

(5)轮密钥加

轮密钥加是将128位轮密钥Ki同状态矩阵中的数据进行逐位异或操作。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节。轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。

 密码学 AES算法实现 c语言_第14张图片

 实验内容:

设置key={ 0x2b, 0x7e, 0x15, 0x16,

          0x28, 0xae, 0xd2, 0xa6,

          0xab, 0xf7, 0x15, 0x88,

          0x09, 0xcf, 0x4f, 0x3c }

设置输入信息=

{0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34}

(1)密钥扩展

W[i]是4的倍数时:w[i-1]循环左移一位,s盒替换, 异或 w[i-4],再与轮数异或

W[i]不是4的倍数时:w[i-1] 异或 w[i-4]

密码学 AES算法实现 c语言_第15张图片

密码学 AES算法实现 c语言_第16张图片

(2)字节代换

直接与sbx_tab表相应行列的值进行替换即可

密码学 AES算法实现 c语言_第17张图片

 

(3)行移位

行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节

密码学 AES算法实现 c语言_第18张图片

(4)列混合

这里调用了一个xtime函数,可以进行0x02乘法//0x03乘法//0x01乘法//0x01乘法

密码学 AES算法实现 c语言_第19张图片

你可能感兴趣的:(岛爷札记,学习)