AES加密中MixColumn函数的c语言编写
AES是块密钥,算法输入128位数据,密钥长度也是128位。Nr用于表示加密一个数据包的轮数(加密轮数与密钥长度的关系列于表1)。每一轮都需要与输入分组长度相同的Expandedkey(i)的参与。因为外部输入的加密密钥K的长度是有限的,所以在算法中应该使用密钥扩展程序来将外部密钥K扩展成更长的比特串,以生成每一轮的加密和解密密钥。
1.1周期变化
AES的每个循环转换由以下三层组成:
非线性层-子字节变换;
行-行混合层-执行ShiftRow和MixColumn操作;
密钥加密-AddRoundKey操作。
①子字节变换是作用于状态中每个字节的非线性字节变换,可以通过计算出的S盒进行映射。
变化:
ldi zh,$ 01;将指针指向S框的第一个地址。
mov zl,R2;将待搜索的数据作为指针低位地址。
ldtemp,z+;拿出这个相应的数据
mov r2,温度;交换数据以完成表格查找
。
。
。
浸水使柔软
② ShiftRow是字节转置。它根据不同的偏移量循环移位状态中的行,这个偏移量也是根据Nb的不同来选择的。其中x是(02),如下图所示。
rcon[1]=[01000000];rcon[2]=[02000000];Rcon[3]=[04000000]……
扩展密钥的生成:扩展密钥的前Nk个字是外部密钥K;后面的字W[[i]]等于它前面的字W[[i-1]]和它前面的Nk字W[[i-Nk]]的异或,即W[[i]]=W[[i-1]]?W[[i- Nk]].但如果I是Nk的倍数,那么W[i]=W[i-Nk]?子字(Rotword(W[[i-1]]))?Rcon[i/Nk].
程序执行时,主要调用上述子程序,具体实现如下:
按键扩展:
rcall rotwoed
呼叫子字
rcall Rcon
。
。
。
2 AES加解密算法的优化
从上面算法的流程中可以清楚的看到,周期变化是整个算法中最耗时的部分,所以算法的优化就在这里;并且圆的变化部分可以优化,也就是列的变化。因为换列是模乘同余法则。由于AES加密解密是非对称的,如果不进行优化,算法的解密速度会比加密快很多[1]。
(1)加密操作。可以通过调用xtime子例程来优化Mixcolumn。
另一种有效的优化方法是离线构造一个表,即列变化表。这样就可以通过查表来提高加密速度。
②解密算法的优化。因为解密列变换的系数分别是09、0E、0B和0D。在AVR单片机上实现上述乘法显然需要大量时间,导致解密性能下降。
优化方法一:分解列变化,减少乘法次数。
仔细研究解密矩阵的系数,不难发现解密矩阵和加密矩阵之间存在一定的关系,即解密矩阵等于加密矩阵和一个矩阵相乘。通过这种连接,可以优化算法:
这样,只用几个简单的异或就可以实现列变换,减少了乘法次数,提高了解密速度。
优化方法二:构造一个表。
和加密构造法一样,可以构造四个表T[ea]= e×a;t[9a]= 9×a;t[9a]= 9×a;T[ba]=b×a .这样只需要查表和简单的异或就可以完成解密任务。虽然这种方法会增加额外的成本,但却是一种有效的方法。
3 AES加解密的实验模拟
根据上述实验步骤和优化方法,得到了表2和表3所列的实验结果。
设置主密钥为:000102030405060708090 a 0 b 0 c 0d 0 e 0 f(128 b it)。
加密明文:00112233455678899 aabbccddeeff。
密文:69 C4 E0 d 86 a7 b 0430 D8 CDB 78070 b4c 55 a。
解密密文:69 C4 E0 d 86 a7 b 0430 D8 CDB 78070 B4 c55a。
明文:00112233455678899 aabbccddeeff。
总之,AES密码是一种非对称密码系统,其解密比加密更复杂,更耗时。解密优化算法不增加存储空间,而是在列变化的基础上进行处理。这个程序比原来的小,而且节省时间。解密优化法速度最快,效率最高,但需要增加系统的存储空间,所以其程序也最大。
省略流程图中朋友的引用。