AES算法作业_x乘法笔记
直接看例子
(HEX)57*13=?
13=(0001 0011)=10异或02异或01
57x13 = 57x(10异或02异或01)
= 57x10 异或 57x02 异或 57x01
这里的 x 就是X乘法运算*
所以:逐个运算
首先 :57*10 怎么算?
b(x)=57; x=10
先算57x01 = 57 (就是57×1)
再算57x02 = AE
怎么算的? 把57写成二进制左移1位就行。
接着算 57x04 = AE再左移
这里注意,如果x乘法结果的第一位大于8(也就是8位二进制形式第一位为1),则在进行一步:将结果与1B异或。
所以57x04 = AE再左移,左移后的结果与1B异或
得 47 (一定要动笔自己算)
接着重复上面得“x02”的步骤就可以得出 57x10的结果为07
上面左移的操作(x02),和结果二进制为1 再异或1B 这段操作。用xtime()来实现
如 57x02 = xtime(57) = AE
57x04 = xtime(57x02)=xtime(AE)=47
经过一番计算
就可以得出
= 5710 异或 5702 异或 57*01
=57异或AE异或07
=FE
用C语言实现一遍,很粗糙的实现方法:
下面展示一些 内联代码片
。
// An highlighted block
//57*13
#include <stdio.h>
int xtime(int bx);
int main(){
int y;
int x=0x13;//x=0xef
int Bx=0x57;//bx=0x02
int bx;
y= x;
unsigned int sum= 0;
if(Bx & 0x01){
sum = x;//
}
if(Bx & 0x02){//57^02
x=y;
x=xtime(x);//0xae
sum = sum^x;//0x57^0xae
}
if(Bx & 0x04){
int i;
x=y;
for(i=1;i<=2;i++)
x=xtime(x);
sum ^=x;
}
if(Bx & 0x08){
int i;
x=y;
for(i=1;i<=3;i++)
x=xtime(x);
sum ^=x;
}
if(Bx & 0x10){//57^10
int i;
x=y;
for(i=1;i<=4;i++)
x=xtime(x);
sum ^=x;
}
if(Bx & 0x20){
int i;
x=y;
for(i=1;i<=5;i++)
x=xtime(x);
sum ^=x;
}
if(Bx & 0x40){
int i;
x=y;
for(i=1;i<=6;i++)
x=xtime(x);
sum ^=x;
}
if(Bx & 0x80){
int i;
x=y;
for(i=1;i<=7;i++)
x=xtime(x);
sum ^=x;
}
printf("%02X",sum&255);
return 0;
}
int xtime(int bx) {
int res,mind;
res = bx <<1;//先左移1位
mind = bx & 128;
if (mind) { //判断b7为1
res ^=0x1b;//&1B
}else{//b7=0;
;
}
return res;
}
var foo = 'bar';