AES 实现

任务一

任意给定两个素数p和q,p!= q,记 N = p * q ,构造Zn
1.是否每个元素都有inverse?是否成群。
2.这个集合有多少元素?

代码

def isprime():
    count = 1
    while (count):
        n = int(input("输入一个质数:"))
        for i in range(2, n):
           if n % i == 0:
                print(" %d 这不是一个质数!" % n)
                break
        else:
            return n

def CommonFactor(a,b):
    if a<b:
        t = a
        a = b
        b = t
    while(a%b):
        t = b
        b = a % b
        a = t
    return b

def is_inverse(list,n):
    mark=1
    for i in range(0,len(list)):
        count=1
        for j in range(0,len(list)):
            if((list[i]*list[j])%n==1):
                count = 0
                print("%s存在逆元%s"%(list[i],list[j]),end="   ")
        if count:
            print("%s不存在逆元"%(list[i]),end="   ")
            mark=0
    print()
    if(mark):
        print("任何元素都有逆元")
    return mark


def is_closed(list,n):
    mark=1
    for i in range(0, len(list)):
        for j in range(0, len(list)):
            count=0
            for k in range(0, len(list)):
                if((list[i]*list[j])%n == list[k]):
                    count=1
                    num=list[k]
            if count:
                print("%s*%s封闭值为%s"%(list[i],list[j],num))
            else:
                print("%s*%s不封闭"%(list[i],list[j]))
                mark=0
    return mark

def main():
    p=isprime()
    count=1
    while(count):
        q=isprime()
        if not q==p:
            count=0
        else:
            print("与第一个质数相同,请重新输入")
    n=p*q
    list=[]
    for i in range(1,n):
        k=CommonFactor(i,n)
        if k==1:
            list.append(i)
    for i in range(0,len(list)):
        print(list[i],end="  ")
    print()
    a=is_inverse(list,n)
    b=is_closed(list,n)
    if a==1 and b==1:
        print("任意元素都有逆元且运算封闭,成群")
        print("群元素有%s个"%(len(list)))
    elif a==0:
        print("存在元素没有逆元,不成群")
    elif b==0:
        print("运算不封闭,不成群")

main()

结果:


捕获.PNG

任务二

写一个程序,实现AES的S-box的构造

代码

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  
 
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)  
  
def multiply(a, b):  #GF(2^8)乘法
    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  
 
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  
 
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") 

运行结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容