有限域GF(2^8)内乘法代码实现以及原理
2014-05-28 22:28
471 查看
在密码学中经常用到有限域的乘法,一般在AES中用到的是GF(2^8)有限域内乘法。什么是有限域呢?有限域通俗的讲就是函数的运算结果全都包含在一个域中,不同于实数域,有限域有一个最大值,所有超过这个最大值的数都会经过一定的方法使他回到这个域中,在密码学中应用很广泛,2^8意味着这个域的最大值是256.
以下代码是GF(2^8)有限域内乘法的C代码实现:
以下讲一下乘法的原理:
在二进制中,所有的数都能用0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80异或得到,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80的二进制表示如下:
后一个分别是前一个的2倍。假设任意一个数a,他的二进制表示为10101101,可以由以下组合组成:
而任何一个数x和a相乘都可以表示为
所以只要计算出
一切乘法的结果都可以得到。
XTIME函数的含义是求一个数x与0x02的乘积,一般求一个数的2倍,都是作移一位,在有限域内,要计算有限域的乘法,必须先确定一个GF上的8次不可约多项式,Rijndael密码中,这个多项式确定为x^8+x^4+x^3+x+1,如果最高位是1的话,作移一位的同时要异或0x1B,是因为最高位是1的话,再继续左移会超出域的最大值,这个时候需要取除以同余式,也就是异或0x1B。
另一个乘数b右移一位和0x01与运算,分别和这8个字符相乘,再把相乘的结果异或。就得到了a和b相乘的结果。
接下来举个例子:
求0x3a*0x24?
首先0x3a=00111010,分别求
0x24=00100100,所以0x3a*0x24=0x3a*00100100=0x04*0x3a^0x20*0x3a=0xe8^0x01=0xe9.
是正确结果。
以下代码是GF(2^8)有限域内乘法的C代码实现:
unsigned char XTIME(unsigned char x) { return ((x << 1) ^ ((x & 0x80) ? 0x1b : 0x00)); } 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]); } tempmultiply = (b & 0x01) * a; for (i = 1; i <= 7; i++) { tempmultiply ^= (((b >> i) & 0x01) * temp[i]); } return tempmultiply; }
以下讲一下乘法的原理:
在二进制中,所有的数都能用0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80异或得到,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80的二进制表示如下:
后一个分别是前一个的2倍。假设任意一个数a,他的二进制表示为10101101,可以由以下组合组成:
而任何一个数x和a相乘都可以表示为
所以只要计算出
一切乘法的结果都可以得到。
XTIME函数的含义是求一个数x与0x02的乘积,一般求一个数的2倍,都是作移一位,在有限域内,要计算有限域的乘法,必须先确定一个GF上的8次不可约多项式,Rijndael密码中,这个多项式确定为x^8+x^4+x^3+x+1,如果最高位是1的话,作移一位的同时要异或0x1B,是因为最高位是1的话,再继续左移会超出域的最大值,这个时候需要取除以同余式,也就是异或0x1B。
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,放在temp这个数组内。接下来通过这个循环
for (i = 1; i <= 7; i++) { tempmultiply ^= (((b >> i) & 0x01) * temp[i]); }
另一个乘数b右移一位和0x01与运算,分别和这8个字符相乘,再把相乘的结果异或。就得到了a和b相乘的结果。
接下来举个例子:
求0x3a*0x24?
首先0x3a=00111010,分别求
0x24=00100100,所以0x3a*0x24=0x3a*00100100=0x04*0x3a^0x20*0x3a=0xe8^0x01=0xe9.
是正确结果。
相关文章推荐
- 有限域GF(2^8)内乘法代码实现以及原理
- Base64加密解密原理以及代码实现
- 动网论坛上传文件漏洞的原理以及攻击的代码实现
- 决策树(1)ID3原理以及代码实现
- 浅谈实现滑动验证码,Java核心代码以及原理分析
- 动网论坛上传文件漏洞的原理以及攻击的代码实现
- Base64加密解密原理以及代码实现
- 转置矩阵的分块并行乘法(C语言实现),计算矩阵C[rawn][rawn]=A[rawm][rawn]'*B[rawm][rawn],子块大小为S*T,其算法实现原理参加本代码的附件。
- 线性回归的数学原理以及代码实现
- [Android开发] 在项目中快速实现 列表字母排序滑动索引 功能原理以及过程代码
- Android高速截屏之vysor反射截屏原理实现方法以及代码下载
- 动网论坛上传文件漏洞的原理以及攻击的代码实现
- 关于卷积神经网络原理以及代码实现应用的几点思考
- Prim算法原理以及完整C代码实现
- Linux SYN Cookie的原理以及代码实现
- jsp自定义标签技术(原理和代码实现以及平台搭建)
- Base64加密解密原理以及代码实现
- jsp自定义标签技术(原理和代码实现以及平台搭建)
- SHA1摘要算法原理以及代码实现
- SVM原理以及Tensorflow 实现SVM分类(附代码)