摘要:
利用GF(2^8)乘法逆元,以及矩阵运算,可以构造出AES的SBOX。求乘法逆元的一般方法是利用扩展欧几里得定理,在这里我取了个巧。因为我已经有了GF的指数表(见上一篇文),利用指数表可以轻易地构造出乘法逆元表。具体方法如下:若 x = 3^m, y = 3^n, x 与 y 互为乘法逆元,则有x * y = 3^m * 3^n = 1 = 3^255(任意乘法逆元的255次方必定为1,有点类似费尔马小定理),则m+n=255#include#include#include using namespace std;unsigned char exp[256], log[256], inv[25 阅读全文
posted @ 2013-10-23 09:20
7hat
阅读(3757)
评论(0)
推荐(0)
摘要:
利用指数表和对数表,实现GF(2^8)的乘法优化。首先利用简单的基础的GF(2^8)乘法,构造指数表和对数表。在这里选取生成元3。指数表exp[i] = 3^i,对数表log[i] = log3(i)。要实现x 与 y 相乘,首先利用对数表找出3^m = x, 3^n = y,这时的乘法就是 x * y = 3^m * 3^n = 3^(m+n),然后利用指数表找到exp[m+n]对应的值。因此所有的乘法都变成了查表操作,提高了效率。但是对于数域较大时,保存对数表和指数表的空间要求较高。典型的牺牲空间换取时间。#include#includeusing namespace std;unsign 阅读全文
posted @ 2013-10-23 09:13
7hat
阅读(1322)
评论(0)
推荐(0)
摘要:
目的是找出所有GF(2^8)的生成元。方法很简单,从2开始遍历,将每个元素都与自身相乘255次,看是否能得到1~255。若能,则是生成元。#include#includeusing namespace std;unsigned char GFmul(unsigned char a, unsigned char b){ //GF(2^8) 乘法 unsigned char result = 0; if((b&1) == 1)result = a; b >>= 1; for(int i = 1; i 127){ a = (a >= 1; ... 阅读全文
posted @ 2013-10-23 09:08
7hat
阅读(1213)
评论(0)
推荐(0)

浙公网安备 33010602011771号