【AES加密算法细节笔记】

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);
    }
}

6.总体流程图

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值