AES SBox的构造(python)
几点需要注意的,求解逆元的时候使用的是拓展欧几里得,但是那些运算规则需要变一变,模2的加减乘除(或者可以理解为多项式的运算)
在进行字节的仿射变换不用进行矩阵的运算。
一个矩阵和一个列向量进行运算的时候可以视为矩阵的列向量的线性组合
代码如下:
#使用拓展欧几里得求解乘法矩阵的逆元
#求一个数的二进制位的长度
def length(a):
len=0
while(a):
a=a>>1
len+=1
return len #模2的加减都是一样的,异或即可
def addSub(a,b):
return (a^b) def gcd(m,n):
while(n!=0):
m,n=n,m%n
return m #乘法
def multi(a,c):
b=0x01
flag=[] #flag得到的是c中为1的位(置)
for j in range(8):
if(c&b):
flag.append(j)
b=(b<<1)&0x00ff #b从最低位开始,不断左移并与c相与,目的是找出c中为1的位
kk=[]
kk.append(a) #将a本身存放进去
for i in range(7): #8位,除了1之外(1就是原数的本身),其余的都先算出结果
if (a&0x80):
a=a<<1
a=a&0x00ff #将高8位清零,保留低8位(如果上述的左移运算的位数超过8位的话),如果没有这个操作的话,不会默认保留低8位
a=a^0x1b
else:
a=a<<1
kk.append(a)
result=0 #任何数与0异或都是其本身
for k in flag:
result=result^kk[k]
return result #参考:https://www.cnblogs.com/YKang/p/7663737.html
#多项式的模2除法运算,函数的返回值是得到的商和余数
def division(a,b):
len1=length(a)
len2=length(b)
len3=len1-len2 if a<b: #被除数小于除数
if len3==0: #两个数的长度相同,则直接商1,余数是二者异或的结果
return (1,a^b)
else:
return (0,a) #如果被除数的位数小于除数,则商0,余数为a topBit=1
topBit<<=(len1-1)
b<<=len3 #将b的位数扩充到和a的位数一样的长度 quotient=0
remainder=0 for i in range(len3):
quotient<<=1 #quotient每次左移一位,就是在后面添加0,然后下面再用一个for循环来确定新增的位是0还是1
if (topBit&a): #a的最高位为0,即意味着a此时的位数按照正常的一位落位可以满足和除数b的运算
quotient^=1 #如果上面的if语句成立,则说明此时的商应该是1,所以0和1异或得1
a^=b
else:
a^=0
topBit>>=1 #每运算一次,这个就应该右移一位,继续判断a的位数是否满足
b>>=1 #b右移的效果也是一样的
quotient<<=1 #quotient继续右移一位,此时新加的为0
if a<b:
remainder=a
else:
quotient^=1
remainder=a^b return quotient,remainder def egcd(a,b):
r0,r1,s0,s1=1,0,0,1
while(b):
qt,rt=division(a,b)
q,a,b=qt,b,rt
r0,r1=r1,addSub(r0,multi(q,r1))
s0,s1=s1,addSub(s0,multi(q,s1))
return s0 #s0是求得的逆元 #矩阵乘以列向量
#矩阵乘以列向量,其实可以以矩阵的列向量进行线性组合
#https://www.zhihu.com/question/21351965/answer/103520656
#也就是矩阵中的第i列和列向量的第i个元素相乘(这里就是简单的相乘,所以那些在列向量中为0的元素就可以忽略不计),
#因为所以的列向量的元素非0几1,所以可以直接使用x进行操作,无须再将x转换成二进制的比特位
#异或运算是二进制位的异或,所以在求解res^M[i]的时候就可以直接把res和整个列进行异或
#参考:https://www.jianshu.com/p/9626fcd97a69
def byteSub(inelem): #传入逆元给函数
M=[0x1F, 0x3E, 0x7C, 0xF8, 0xF1, 0xE3, 0xC7, 0x8F]
res=0x00
i=0
x=inelem
while x>0:
if x%2:
res^=M[i]
i+=1
x>>=1 #位移或者 '//'
return hex(res^0x63) def sBox():
box=[]
for i in range(256):
sbox=byteSub(egcd(283,i))
box.append(sbox)
for j in range(256):
print(box[j],end=' ')
if (j+1)%16==0:
print('\n') sBox()
参考:https://www.jianshu.com/p/9626fcd97a69
https://www.cnblogs.com/YKang/p/7663737.html
https://www.zhihu.com/question/21351965/answer/103520656
AES SBox的构造(python)的更多相关文章
- AES加密例子(python和php版本)
AES加密例子(python和php版本) AES加密例子(python和php版本)
- 第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头
一. 引言 在<第14.3节 使用google浏览器获取网站访问的http信息>和<第14.4节 使用IE浏览器获取网站访问的http信息>中介绍了使用Google浏览器和IE ...
- AES的S-BOX构造优化
之前写过SBOX的构造,后来看到别人的优秀思路,借鉴过来重新改了一点. 原文地址:http://www.cnblogs.com/7hat/p/3383546.html 主要是将矩阵运算改为列运算之和, ...
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...
- 使用python进行加密解密AES算法
使用python进行加密解密AES算法-代码分享-PYTHON开发者社区-pythoner.org 使用python进行加密解密AES算法 TY 发布于 2011-09-26 21:36:53,分类: ...
- Python 的AES加密与解密
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...
- 最新版-Python和Java实现Aes相互加解密
前情 需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然. Python实现 Python为3.6版本 # -*- coding: ...
- python实现AES加密、解密
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...
- Python Learning
这是自己之前整理的学习Python的资料,分享出来,希望能给别人一点帮助. Learning Plan Python是什么?- 对Python有基本的认识 版本区别 下载 安装 IDE 文件构造 Py ...
随机推荐
- 关闭Oracle 11g的DPR特性
关闭Oracle 11g的DPR(Direct Path Read)特性 查看event参数值: SQL> show parameter event NAME TYPE VALUE ------ ...
- System.arraycopy方法详解
- strus2 框架介绍
strus2 执行过程: ActionMapper会去找ActionMapping查找URL请求的映射 1:ActionMapping这个类用name+namespace确定请求的映射, (但是仍然不 ...
- eclipse设置字体、字符编码、快捷键
1.设置字体: preferences->general->appearnce->colors and fonts->edit->字体大小14,字形常规,字体Consol ...
- X-UA-Compatible
X-UA-Compatible是神马? X-UA-Compatible是IE8的一个专有<meta>属性,它告诉IE8采用何种IE版本去渲染网页,在html的<head>标签中 ...
- MFC六大核心机制之五、六:消息映射和命令传递
作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实.所以,我们对于在进行MFC视窗程序设计时经常要 ...
- 取n的某些位
实例十一:取n的某些位 方法:result=(n>>4)&(~(~0<<4)) 取出某数n的低4位. 数值0 0000 0000 ~0 1111 1111 ~0& ...
- linux服务器---squid限制
Squid连接限制 Squid可以有效的限制连接,指定哪些用户可以连接,指定哪些网站可以访问,这样就可以有效的利用服务器带宽. 1.限制指定网段不能连接.编辑配置文件”/etc/squid/squid ...
- Docker 的 Web 管理工具 DockerFly
Dockerfly是基于 Docker1.12+ (Docker API 1.24+) 开发出Docker 管理工具,提供里最基本的基于 Docker 的管理功能,目的是能够方便广大Docker初学者 ...
- STM8S003F3通过PWM波实现三基色呼吸灯(转)
源: STM8S003F3通过PWM波实现三基色呼吸灯