GF(2^8)定义的一个运算为x乘法,其定义为:
如果b7=0,求模结果不变,否则为乘积结果减去m(x),即求乘积结果与m(x)的异或。由此得出,x(十六进制02)乘b(x)可以先对b(x)在字节内左移一位(最后一位补0);若b7=1,则x乘b(x)可以先对b(x)在字节内左移一位再与1B(其二进制为00011011)做逐比特异或来实现,该运算记为b=xtime(a)。
x的幂乘运算可以重复应用xtime来实现。而任意常数乘法可以通过对中间结果相加实现。
规则【1】:x的幂乘运算可以重复应用xtime来实现,即左边不断与2相乘,这一过程到(80)即可。
规则【2】:任意常数的乘法可以通过中间结果相加实现。
例:
'57'•'02'=xtime(57)=’AE’
'57'•'04'=xtime(AE)=’47’
'57'•'08'=xtime(47)=’8E’
'57'•'10'=xtime(8E)=’07’ //2*8=16,,16的十六进制是10
'57'•'20'=xtime(07)=’0E’
'57'•'40'=xtime(OE)=’1C’
'57'•'80'=xtime(1C)=’38’
推导如下:
‘57’·‘01’=‘57’=01010111
因为b7=0,所以xtime(‘57’)=10101110=‘AE’,即‘57’·‘02’=xtime(‘57’)=‘AE’ //10101110由‘57’的二进制数左移一位右边第一位补0而来
因为b7=1,所以xtime(‘AE’)=01011100⊕00011011=01000111=‘47’,即‘57’·‘04’=xtime(‘AE’)=‘47’ //01011100由‘57’的二进制数左移一位右边第一位补0而来,此时需再与00011011(1B)做异或运算
因为b7=0,所以xtime(‘47’)=10001110=‘8E’,即‘57’·‘08’=xtime(‘47’)=‘8E’
因为b7=1,所以xtime(‘8E’)=00011100⊕00011011=00000111=‘07’,即‘57’·‘10’= xtime(‘8E’)=‘07’
因为b7=0,所以xtime(‘07’)=00001110=‘0E’,即‘57’·‘20’=xtime(‘07’)=‘0E’
因为b7=0,所以xtime(‘0E’)=00011100=‘1C’,即‘57’·‘40’=xtime(‘0E’)=‘1C’
因为b7=0,所以xtime(‘1C’)=00111000=‘38’,即‘57’·‘80’=xtime(‘1C’)=‘38’
相关计算:
(1)57·0A //0A为十六进制,A仅能由02、04、08拼凑,不能用10,10是十进制16.
=57·(02⊕08)
=57·02⊕57·08
=AE⊕8E
=10101110⊕10001110
=00100000
=20
(2)57·2B
=57·(20⊕08⊕02⊕01)
=57·20⊕57·08⊕57·02⊕57·01
=0E⊕8E⊕AE⊕57
=00001110⊕10001110⊕10101110⊕01010111
=01111001
=79
(3)57·37
=57·(20⊕10⊕04⊕02⊕01)
=57·20⊕57·10⊕57·04⊕57·02⊕57·01
=0E⊕07⊕47⊕AE⊕57
=00001110⊕00000111⊕01000111⊕10101110⊕01010111
=10110111
=B7
(4)57·59
=57·(40⊕10⊕08⊕01)
=57·40⊕57·10⊕57·08⊕57·01
=1C⊕07⊕8E⊕57
=00011100⊕00000111⊕10001110⊕01010111
=11000010
=C2
(5)57·6C
=57·(40⊕20⊕08⊕04)
=57·40⊕57·20⊕57·08⊕57·04
=1C⊕0E⊕8E⊕47
=00011100⊕00001110⊕10001110⊕01000111
=11011011
=DB
(6)57·73
=57·(40⊕20⊕10⊕02⊕01)
=57·40⊕57·20⊕57·10⊕57·02⊕57·01
=1C⊕0E⊕07⊕AE⊕57
=00011100⊕00001110⊕00000111⊕10101110⊕01010111
=11101100
=EC