1.AES加密算法介绍
AES(Advanced Encryption Standard)算法是一种对称加密算法,其原理采用的是迭代分组密码算法,它由轮变换函数经过数次迭代变换而成,其迭代的次数与密钥的长度有关。
- 密钥长度为128bit,一组明文需要运算10轮即可完成加解密;
- 密钥长度为192bit,一组明文需要12轮运算即可完成加解密;
- 密钥长度为256bit,一组明文需要14轮运算即可完成加解密。
2.加密流程1 --轮密钥加
操作:每一轮都需要使用准备好的密钥进行异或并作为下一轮的轮密钥加的数据
原理:有限域中的密钥加变换对应于数据的异或运算,而异或运算再异或正好是其本身,所以密明加的逆变换仍然是密明加变换。
void AddRoundKey(unsigned char state[4][4], unsigned char* key)
{
for (int row = 0; row < 4; row++) {
for (int col = 0; col < 4; col++) {
state[col][row] ^= key[col * 4 + row];
}
}
}
3.加密流程2 --字节变换
操作:在进行映射时,需要把该字节的高4位作为行值,低4位作为列值,选中的字节就是变换后的字节,如下是16*16的sbox
原理:在AES加解密算法中,字节代换与逆代换是唯一的非线性运算
如原始数据是0x23,就需要找sbox的第二行,第三列的值,并且将0x23替换成该值
如下图,在sbox的第一个数据找到了0x23,将高位2作为行,低位3作为列,再去sbox找替换后的值为0x26,因此0x23被替换成0x26
4.加密流程3 --行移位
原理: 行移位通过循环左移实现,即:
第0行:左移0位 S0.0 S0.1 S0.2 S0.3 =》S0.0 S0.1 S0.2 S0.3
第1行:左移1位 S1.0 S1.1 S1.2 S1.3 =》S1.1 S1.2 S1.3 S1.0
第2行:左移2位 S2.0 S2.1 S2.2 S2.3 =》S2.2 S2.3 S2.0 S2.1
第3行:左移3位 S3.0 S3.1 S3.2 S3.3 =》S3.3 S3.0 S3.1 S3.2
实现:
void shift_rows(unsigned char* buffer)
{
register unsigned char i, j, k, l; /* to make it potentially parallelable :) */
i = buffer[1];
buffer[1] = buffer[5];
buffer[5] = buffer[9];
buffer[9] = buffer[13];
buffer[13] = i;
j = buffer[10];
buffer[10] = buffer[2];
buffer[2] = j;
k = buffer[3];
buffer[3] = buffer[15];
buffer[15] = buffer[11];
buffer[11] = buffer[7];
buffer[7] = k;
l = buffer[14];
buffer[14] = buffer[6];
buffer[6] = l;
}
5.加密流程4 --列混合
原理:
列混合定义:MixColumn(State)是将状态矩阵的每一列看成GF(2^8) 上的一个多项式,
且与一个固定的多项式,感兴趣可自行了解。
实现:
inline unsigned char rj_xtime(unsigned char x)
{
return (x & 0x80) ? ((x << 1) ^ 0x1b) : (x << 1);
}
void mix_columns(unsigned char* buffer)
{
register unsigned char i, a, b, c, d, e;
for (i = 0; i < 16; i += 4)
{
a = buffer[i];
b = buffer[i + 1];
c = buffer[i + 2];
d = buffer[i + 3];
e = a ^ b ^ c ^ d;
buffer[i ] ^= e ^ rj_xtime(a^b);
buffer[i + 1] ^= e ^ rj_xtime(b^c);
buffer[i + 2] ^= e ^ rj_xtime(c^d);
buffer[i + 3] ^= e ^ rj_xtime(d^a);
}
}