AES加密算法的数学基础

本文是根据自己对AES加密算法的理解,总结并整理出的AES算法数学基础。表述方面存在诸多不足,后续会慢慢改进。

1、字节运算:有限域GF(2^8)上的运算

(1)有限域GF(2^8)

        有限域GF(2^8)表示特征为2的具有2^8个元素的有限域,这里表示成系数在{0,1}中的多项式集合:

                                        b(x)={b7x^7+b6x^6+b5x^5+b4x^4+b3x^3+b2x^2+b1x+b0}

       这样任意的8位二进制数就和有限域中的一个多项式建立了一一对应的关系。

(2)加法运算

      在多项式表示中,GF(2^8)上两个元素的和仍然是一个次数不超过7的多项式,其系数等于两个元素对应的系数的模2加(即异或)。

      由于每个元素的加法逆元等于自己,所以减法和加法相同。

(3)乘法运算

      在AES算法中,若两个多项式进行乘法运算,运算的方法为两个多项式相乘,若运算的结果超过8次方,则必须对此结果对一个多项式m(x)进行模运算。AES算法中,这个8次不可约多项式确定为m(x)=x^8+x^4+x^3+x+1

     乘法原理:

      在二进制中,所有的数都能用0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80异或得到。

       0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80的表示如下:


也就是说,一切乘法的结果都由用上式得到。

乘法运算代码如下:

unsigned char multiply(unsigned char a, unsigned char b) 
{
	unsigned char temp[8] = { a };
	unsigned char tempmultiply = 0x00;
	int i = 0;
	for (i = 1; i < 8; i++) 
	{
		temp[i] = XTIME(temp[i - 1]);//经过这个循环可以得到一串包含8个字符的数组。
		                             //分别是0x01*x,0x02*x,0x04*x,0x08*x,0x10*x,0x20*x,0x40*x,0x80*x。
	}
	tempmultiply = (b & 0x01) * a;
	for (i = 1; i <= 7; i++)
	{
		tempmultiply ^= (((b >> i) & 0x01) * temp[i]);//通过这个循环,另一个乘数b右移一位和0x01进行与运算,
		                                              //分别和8个字符相乘,再把相乘结果异或,就得到a*b的结果
	}
	return tempmultiply;
}

(4)x乘法

    GF(2^8)上还定义了一个运算,称为x乘法,其定义为:

                            x*b(x)=b7x^8+b6x^7+b5x^6+b4x^5+b3x^4+b2x^3+b1x^2+b0x(modm(x))

      XTIME函数的含义是求一个数x与0x02的乘积,一般求一个数的2倍,都是左移一位。要计算有限域乘法,必须先确定GF上的8次不可约多项式。AES算法中,多项式确定为x^8+x^4+x+1,如果最高位是1的话,左移一位的同时要异或0x1b,是因为高位是1的话,再继续左移会超出域的最大值,这个时候需要除以同余式,也就是异或0x1b。

代码如下:

unsigned char XTIME(unsigned char x)
{
	return (x<<1^(x&0x80)?0x1B:0x00));   
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值