AES SBox的构造(python)

几点需要注意的,求解逆元的时候使用的是拓展欧几里得,但是那些运算规则需要变一变,模2的加减乘除(或者可以理解为多项式的运算)

在进行字节的仿射变换不用进行矩阵的运算。

一个矩阵和一个列向量进行运算的时候可以视为矩阵的列向量的线性组合

代码如下:

  1 #使用拓展欧几里得求解乘法矩阵的逆元
  2 #求一个数的二进制位的长度
  3 def length(a):
  4     len=0
  5     while(a):
  6         a=a>>1
  7         len+=1
  8     return len
  9 
 10 #模2的加减都是一样的,异或即可
 11 def addSub(a,b):
 12     return (a^b)
 13     
 14 def gcd(m,n):
 15     while(n!=0):
 16         m,n=n,m%n
 17     return m        
 18 
 19 #乘法
 20 def multi(a,c):
 21     b=0x01
 22     flag=[]                  #flag得到的是c中为1的位(置)
 23     for j in range(8):
 24         if(c&b):
 25             flag.append(j)
 26         b=(b<<1)&0x00ff      #b从最低位开始,不断左移并与c相与,目的是找出c中为1的位
 27     kk=[]
 28     kk.append(a)            #将a本身存放进去
 29     for i in range(7):      #8位,除了1之外(1就是原数的本身),其余的都先算出结果
 30         if (a&0x80):
 31             a=a<<1
 32             a=a&0x00ff    #将高8位清零,保留低8位(如果上述的左移运算的位数超过8位的话),如果没有这个操作的话,不会默认保留低8位
 33             a=a^0x1b
 34         else:
 35             a=a<<1
 36         kk.append(a)
 37     result=0              #任何数与0异或都是其本身
 38     for k in flag:
 39         result=result^kk[k]
 40     return result
 41 
 42 #参考:https://www.cnblogs.com/YKang/p/7663737.html    
 43 #多项式的模2除法运算,函数的返回值是得到的商和余数
 44 def division(a,b):
 45     len1=length(a)
 46     len2=length(b)
 47     len3=len1-len2
 48     
 49     if a<b:                   #被除数小于除数
 50         if len3==0:          #两个数的长度相同,则直接商1,余数是二者异或的结果
 51             return (1,a^b)
 52         else:
 53             return (0,a)      #如果被除数的位数小于除数,则商0,余数为a
 54             
 55     topBit=1
 56     topBit<<=(len1-1)       
 57     b<<=len3                #将b的位数扩充到和a的位数一样的长度
 58     
 59     quotient=0
 60     remainder=0
 61     
 62     for i in range(len3): 
 63         quotient<<=1        #quotient每次左移一位,就是在后面添加0,然后下面再用一个for循环来确定新增的位是0还是1
 64         if (topBit&a):        #a的最高位为0,即意味着a此时的位数按照正常的一位落位可以满足和除数b的运算
 65             quotient^=1     #如果上面的if语句成立,则说明此时的商应该是1,所以0和1异或得1
 66             a^=b
 67         else:
 68             a^=0            
 69         topBit>>=1          #每运算一次,这个就应该右移一位,继续判断a的位数是否满足
 70         b>>=1               #b右移的效果也是一样的
 71     quotient<<=1            #quotient继续右移一位,此时新加的为0
 72     if a<b:
 73         remainder=a         
 74     else:
 75         quotient^=1
 76         remainder=a^b
 77         
 78     return quotient,remainder
 79 
 80 def egcd(a,b):
 81     r0,r1,s0,s1=1,0,0,1
 82     while(b):
 83         qt,rt=division(a,b)
 84         q,a,b=qt,b,rt
 85         r0,r1=r1,addSub(r0,multi(q,r1))
 86         s0,s1=s1,addSub(s0,multi(q,s1))
 87     return s0                    #s0是求得的逆元
 88 
 89 #矩阵乘以列向量
 90 #矩阵乘以列向量,其实可以以矩阵的列向量进行线性组合
 91 #https://www.zhihu.com/question/21351965/answer/103520656
 92 #也就是矩阵中的第i列和列向量的第i个元素相乘(这里就是简单的相乘,所以那些在列向量中为0的元素就可以忽略不计),
 93 #因为所以的列向量的元素非0几1,所以可以直接使用x进行操作,无须再将x转换成二进制的比特位
 94 #异或运算是二进制位的异或,所以在求解res^M[i]的时候就可以直接把res和整个列进行异或
 95 #参考:https://www.jianshu.com/p/9626fcd97a69
 96 def byteSub(inelem):         #传入逆元给函数
 97     M=[0x1F, 0x3E, 0x7C, 0xF8, 0xF1, 0xE3, 0xC7, 0x8F]
 98     res=0x00
 99     i=0
100     x=inelem
101     while x>0:
102         if x%2:
103             res^=M[i]
104         i+=1                   
105         x>>=1                 #位移或者 '//'
106     return hex(res^0x63)
107 
108 def sBox():
109     box=[]
110     for i in range(256):
111         sbox=byteSub(egcd(283,i))
112         box.append(sbox)
113     for j in range(256):
114         print(box[j],end=' ')
115         if (j+1)%16==0:
116             print('\n')
117             
118 sBox()
View Code

 

参考:https://www.jianshu.com/p/9626fcd97a69

           https://www.cnblogs.com/YKang/p/7663737.html

      https://www.zhihu.com/question/21351965/answer/103520656

转载于:https://www.cnblogs.com/Guhongying/p/9822499.html

AES的S盒 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 1 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0 2 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15 3 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75 4 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84 5 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF 6 D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8 7 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2 8 CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73 9 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB A E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79 B E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08 C BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A D 70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E E E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF F 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16 ################################################################################ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 52 09 6A D5 30 36 A5 38 BF 40 A3 9E 81 F3 D7 FB 1 7C E3 39 82 9B 2F FF 87 34 8E 43 44 C4 DE E9 CB 2 54 7B 94 32 A6 C2 23 3D EE 4C 95 0B 42 FA C3 4E 3 08 2E A1 66 28 D9 24 B2 76 5B A2 49 6D 8B D1 25 4 72 F8 F6 64 86 68 98 16 D4 A4 5C CC 5D 65 B6 92 5 6C 70 48 50 FD ED B9 DA 5E 15 46 57 A7 8D 9D 84 6 90 D8 AB 00 8C BC D3 0A F7 E4 58 05 B8 B3 45 06 7 D0 2C 1E 8F CA 3F 0F 02 C1 AF BD 03 01 13 8A 6B 8 3A 91 11 41 4F 67 DC EA 97 F2 CF CE F0 B4 E6 73 9 96 AC 74 22 E7 AD 35 85 E2 F9 37 E8 1C 75 DF 6E A 47 F1 1A 71 1D 29 C5 89 6F B7 62 0E AA 18 BE 1B B FC 56 3E 4B C6 D2 79 20 9A DB C0 FE 78 CD 5A F4 C 1F DD A8 33 88 07 C7 31 B1 12 10 59 27 80 EC 5F D 60 51 7F A9 19 B5 4A 0D 2D E5 7A 9F 93 C9 9C EF E A0 E0 3B 4D AE 2A F5 B0 C8 EB BB 3C 83 53 99 61 F 17 2B 04 7E BA 77 D6 26 E1 69 14 63 55 21 0C 7D
AES SBox的线性逼近表是一种用于分析AES加密算法的线性逼近攻击方法。它可以用于破解AES加密的密钥,是密码学领域常用的攻击方式之一。 线性逼近表的生成过程是这样的:首先,我们需要选取一组输入和输出的二进制比特串,这组比特串应该尽可能的多,以便于在逼近表观察到更多的线性关系。然后,我们需要计算输入和输出比特串之间的线性关系。这个线性关系通常表示为一个布尔函数,其输入比特串是布尔变量,输出比特串是函数的值。最后,我们需要计算这个布尔函数在所有可能输入上的期望值,这个期望值就是线性逼近表的表项。 具体地,计算线性逼近表的方法如下: 1. 选取一组尽可能多的输入和输出比特串。 2. 对于每一组输入和输出比特串,计算它们之间的线性关系。这个线性关系可以用一个布尔函数来表示。 3. 对于每一个可能的输入比特串,计算这个布尔函数在该输入上的期望值,即计算所有输出比特串的乘积之和,再除以总共的输出比特串的个数。这个期望值就是线性逼近表的表项。 计算出线性逼近表后,我们可以使用这个表来分析AES加密算法的密钥。具体地,我们可以将AES加密算法的SBox看作一个函数,该函数的输入是8比特的二进制数,输出也是8比特的二进制数。然后,我们可以将输入分为两个4比特的半字节,将输出分为两个4比特的半字节。对于每一组半字节,我们可以使用线性逼近表来计算它们之间的线性关系,并得到一个线性逼近值。最后,我们可以将两个半字节的线性逼近值相加,得到整个SBox的线性逼近值。 使用线性逼近表可以有效地分析AES加密算法的密钥。但是,由于线性逼近表只能找到线性关系,因此对于非线性的AES加密算法,线性逼近表的攻击效果可能会受到限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值