1.题目
写一个程序,实现AES的S-box的构造。
作业要求如下:
1、使用Python或者Sage语言;
2、上交电子版,用MD书写,提交网络链接即可;比如,使用jianshu、github、作业部落或者CSDN等;
3、代码需具有可读性和可验证性(比如,可容易让审阅者知道所生成的S-box的正确性。)
2.平台
win8.1 Anaconda软件的spyder
3.思路
S盒是一个16*16的矩阵,构造AES的s_box时,主要过程为:
- 初始化s_box,使第i行第j列的元素为s_box[i][j];
- 扩展欧几里得算法,实现GF(2^8)的乘法运算;
- 对每个元素求乘法逆元;
- 运用公式计算出最终的s_box,公式:b′i=bi⊕b(i+4)mod8⊕b(i+5)mod8⊕b(i+6)mod8⊕b(i+7)mod8⊕cibi′=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
4.程序
主要函数:
- "初始化S-box,元素为{ij}" def original()
- "对sbox的每个元素求乘法逆元" def multiplicativeinverse(x)
- "多项式除法,返回(x/y)" def divide(x , y, k)
- "GF(2^8)乘法运算,返回x * y " def multiply(x,y)
- "找到非零最高位并返回" def returntop(n)
- "运用公式进行映射 " def map(b)
- "主函数" def main()
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ #include <cstdio> sbox[16][16] "初始化S-box,元素为{ij}" def original(): for i in range(0,0xF): for j in range(0,0xF): sbox[i][j] = multiplicativeinverse((i << 4) + j) "乘法逆元求sbox" print(sbox[i][j]) "对sbox的每个元素求乘法逆元" def multiplicativeinverse(x): if x==0: return 0 a0 = 0x11B a1 = x a2, q c0 = 0, c1 = 1, c2 q = divide(a0, a1 , a2) "多项式除法 " c2 = w0 ^ multiply(q, c1) while(c1==1): print("%d=%02x,%d=02x,%d=02x\n" % q,b2,c2) if(a2 == 0): break a0 = a1 a1 = a2 q = divide(a0, a1, a2) c0 = c1 c1 = c2 c2 = c0 ^ multiply(q,c1) "乘法,返回q*c1" return c1 "多项式除法,返回(x/y)" def divide(x , y, k): x_returntop = returntop(x) "返回x的非零最高位" b_returntop = returntop(y) if x<y: k = x return 0 bit = x_returntop - y_returntop unsigned short temp = y temp = temp << bit "temp左移" x = x^ temp return (1 << bit) | divide(x, y, k) "GF(2^8)乘法运算,返回x * y " def multiply(x,y): mul = 0 if(y & 0x01): mul = x for i in range(1,8): if(b &: (0x01 << i)): temp = x for j in range(0i): if not(temp & 0x80): temp <<= 1 else: temp <<= 1 temp = temp ^ 0x1B mul = mul ^ temp return mul "找到非零最高位并返回" def returntop(n): for i in range(0,8): if not(num >> (i + 1)): return i "运用公式进行映射 " def map(b): c = 0x63 mul = 0x0 temp = 0x0 for i in range(0,8): temp = temp ^ ((b>> i) & 0x1) ^ ((b >> ((i + 4) % 8)) & 0x1) "优先级>> 高于 & " temp = temp ^ ((b >> ((i + 5) % 8)) & 0x1) ^ ((b >> ((i + 6) % 8)) & 0x1) temp = temp ^ (b >> ((i + 7) % 8)) & 0x1) ^ ((c >> i) & 0x1) res = res | (temp << i) temp = 0x0 return mul "主函数" def main(): original() for i in range(0,0xF): for j in range(0,0xF): sbox[i][j] = map(sbox[i][j]) print("%02X ",sbox[i][j]) return 0 main()
5.结果
程序出了一些错误,无法实现,经过多次修改也没有正确。python刚入门,很多东西都不懂,通过这次实践作业学习到了很多,也一点点地在进步,我会多加学习,写好代码。