整体思路:
1.初始化S-box,使第xx行第yy列的元素为{xyxy}。
2.对S-box中的每个元素求乘法逆元
3.对S-box中的公式运用一下公式得到最终的S-box。
b′i=bi⊕b(i+4)mod8⊕b(i+5)mod8⊕b(i+6)mod8⊕b(i+7)mod8⊕ci
bi′=bi⊕b(i+4)mod8⊕b(i+5)mod8⊕b(i+6)mod8⊕b(i+7)mod8⊕ci
其中(c7c6c5c4c3c2c1c0=(01100011)(c7c6c5c4c3c2c1c0=(01100011), 即c=0x63c=0x63。
来自《密码编码学与网络安全——原理与实践》第七版
第6.3节 AES TRANSFORMATION FUNCTIONS
完整代码如下:
1.初始化S-box,使第xx行第yy列的元素为{xyxy}。
2.对S-box中的每个元素求乘法逆元
3.对S-box中的公式运用一下公式得到最终的S-box。
b′i=bi⊕b(i+4)mod8⊕b(i+5)mod8⊕b(i+6)mod8⊕b(i+7)mod8⊕ci
bi′=bi⊕b(i+4)mod8⊕b(i+5)mod8⊕b(i+6)mod8⊕b(i+7)mod8⊕ci
其中(c7c6c5c4c3c2c1c0=(01100011)(c7c6c5c4c3c2c1c0=(01100011), 即c=0x63c=0x63。
来自《密码编码学与网络安全——原理与实践》第七版
第6.3节 AES TRANSFORMATION FUNCTIONS
完整代码如下:
global r2
sbox = [[0 for col in range(16)] for row in range(16)]
#找到非零最高位并返回
def msb(num):
for i in range(0,8):
if not(num >> (i + 1)):
return i
#一个字节的多项式除法,返回商(a/b)
def divide(a, b, r2):
a_msb = msb(a)
b_msb = msb(b)
if(a < b):
r = a
return 0;
bit = a_msb - b_msb
temp = b
temp = temp << bit
a = a ^ temp
return (1 << bit) | divide(a, b, r2)
#GF(2^8)乘法,返回a * b
def multiply(a, b):
res = 0
if(b & 0x01):
res = a
for i in range(0,8):
if(b & (0x01 << i)):
temp = a
for j in range(0,i):
if not(temp & 0x80):
temp <<= 1
else:
temp <<= 1
temp = temp ^ 0x1B
res = res ^ temp
return res
#扩展欧几里得算法求b在GF(2^8)的乘法逆元
def inverse(b):
if(b == 0):
return 0
r0 = 0x11B
r1 = b
w0 = 0
w1 = 1
q = divide(r0,r1,r2)
w2 = w0 ^ multiply(q, w1)
while(1):
if(r2 == 0):
break
r0 = r1
r1 = r2
q = divide(r0, r1, r2)
w0 = w1
w1 = w2
w2 = w0 ^ multiply(q, w1)
return w1
#初始化 sbox[i][j] <- {ij}
def initialize():
for i in range(0,0xF):
for j in range(0,0xF):
sbox[i][j] = inverse((i << 4) + j)
#映射
def map( a):
c = 0x63
res = 0x0
temp = 0x0
for i in range(0,8):
temp = temp ^ ((a >> i) & 0x1) ^ ((a >> ((i + 4) % 8)) & 0x1)
temp = temp ^ ((a >> ((i + 5) % 8)) & 0x1) ^ ((a >> ((i + 6) % 8)) & 0x1)
temp = temp ^ ((a >> ((i + 7) % 8)) & 0x1) ^ ((c >> i) & 0x1)
res = res | (temp << i)
temp = 0x0
return res
initialize()
for i in range(0, 0xF):
print()
for j in range(0, 0xF):
sbox[i][j] = map(sbox[i][j])
print('%-2d' % sbox[0][1], end=' ')
print("a")