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 ...
随机推荐
- TempData["a"]多个Action方法之前共享数据
ViewData["a"]只可以在自己视图的页面里被访问,但TempData["a"]可以多个Action方法之前共享数据,比如在 @{Html.RenderA ...
- VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)
鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建.停靠与使用. 工具栏的使用 上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有 ...
- Object-C-属性参数
assign:默认参数setter 方法不会引起引用计数的变化 retain:setter方法首先释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为1 copy:setter 方法首先 ...
- 把kafka数据从hbase迁移到hdfs,并按天加载到hive表(hbase与hadoop为不同集群)
需求:由于我们用的阿里云Hbase,按存储收费,现在需要把kafka的数据直接同步到自己搭建的hadoop集群上,(kafka和hadoop集群在同一个局域网),然后对接到hive表中去,表按每天做分 ...
- Hive 复制分区表和数据
1. 非分区表: 复制表结构: create table new_table as select * from exists_table where 1=0; 复制表结构和数据: create tab ...
- mustache多次渲染和多个赋值
mustache多次渲染和多个赋值, html页面的script标签中的代码,设置多个键: <!-- 项目列表 --> <script type="text/x-templ ...
- MySQL性能分析和优化
1. EXPLAIN 优化你的 SELECT 查询 2. 当只要一行数据时使用 LIMIT 1 3. 为搜索字段建索引 like %最好放右边 4. 尽可能的使用 NOT NULL 5. 在Join表 ...
- ACM第二站————STL之stack
栈,作为一种最基础的数据结构(栈还是一种内存的存储形式,就不介绍了),在各种数据结构的题目都会间接或者直接用到. 栈是一种受到限制的线性表,其限制是仅允许在表的一端进行插入和删除运算.这也给予了栈的一 ...
- UVA756 Biorhythms
UVA756 Biorhythms crt crt裸题 因为模数已知所以有些值能直接求 #include<iostream> #include<cstdio> using na ...
- 20145122《 Java网络编程》实验五实验报告
实验名称 Java网络编程 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 结对小伙伴 20145120黄玄曦 博客地址:http://www.cnblo ...