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 ...
随机推荐
- js全选反选
<style type="text/css"> table { width: 800px; text-align: left; border-collapse: col ...
- Vue项目图片剪切上传——vue-cropper的使用
最近自己在研究vue,然后做了一个小型的后台管理系统用来练手,开发过程中,想到了剪切图片上传用户头像的需求.上网百度了一番,发现好多用的都是vue-cropper.我也就用了,个人感觉还是挺好用的.现 ...
- shell篇(二)
Linux的shell种类比较多,常见的有:Bourne Shell(/user/bin/sh或者/bin/sh), Bourne Again Shell(/user/bin/bash或者/bin/b ...
- VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)
上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...
- Intro to Python for Data Science Learning 2 - List
List from:https://campus.datacamp.com/courses/intro-to-python-for-data-science/chapter-2-python-list ...
- Jmeter--正则表达式提取器
正则提取器的一般使用场景是, 在我第二个请求参数中需要加入第一个请求的返回值, 此时通过正则提取器可以提取第一个请求返回值中指定的字段信息并赋值, 在第二个请求参数中直接引用该变量即可 jmeter的 ...
- python之路----进程三
IPC--PIPE管道 #创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在 ...
- ES6学习--Object.assign()
ES6提供了Object.assign(),用于合并/复制对象的属性. Object.assign(target, source_1, ..., source_n) 1. 初始化对象属性 构造器正是为 ...
- ImageLoader作用 AAAA
https://github.com/nostra13/Android-Universal-Image-Loader ImageLoader作用 1.多线程下载图片,图片可以来源于网络,文件系统,项目 ...
- Sybase 存储过程中IF的用法
Sybase 存储过程中IF的用法 --@i_val 为参数 or @i_val is null then begin --执行内容 end; end if;