python--AES的s_box的构造

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,公式:bi=bib(i+4)mod8b(i+5)mod8b(i+6)mod8b(i+7)mod8cibi′=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刚入门,很多东西都不懂,通过这次实践作业学习到了很多,也一点点地在进步,我会多加学习,写好代码。

猜你喜欢

转载自blog.csdn.net/lyt_mico/article/details/79751257
AES
Box