2021-10-23

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';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值