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 ...
随机推荐
- python 安装 Scrapy 模块
环境的安装总是让人多愁善感,爱恨交叉... 本人安装环境:win7 64 + python2.7 先来几个网站 https://doc.scrapy.org/en/latest/intro/insta ...
- Summary: gcd最大公约数、lcm最小公倍数算法
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + ...
- LeetCode7.反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...
- linux中vim的常用方法
i 当前光标位置插入 a 当前光标后插入 0 另起一行插入 A 在光标所在行尾插入 I 在光标所在行首插入 :set nu设置 行号 :set nunu 取消行号 gg 到第一行 G 到最后一行 $ ...
- vue框架(二)_vue环境搭建及创建项目
1.node.js:概念介绍及安装 node.js:是一个基于chrome浏览器的v8引擎,可以运行javascript的环境(平台) 特性:异步IO模型 npm:是一个包管理器(工具),可以按装依赖 ...
- LoadRunner 自动关联、手动关联的帖子
https://www.guru99.com/correlation-in-loadrunner-ultimate-guide.html 这个网页里介绍了关联的概念,自动关联和手动关联的知识...
- 测试开发-PC客户端测试要点
一级测试点 二级测试点 安装测试 首次安装(exe和msi格式的不同) 安装程序权限检查 软件安装包的描述和属性信息 静默安装和非静默安装测试 有UAC安装.无UAC安装 联网安装.断网安装 对必 ...
- linux基础命令---tr
tr 删除或者更改文件中的字符串,这个指令一般需要两个字符集. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- 原 用Tomcat服务器配置https双向认证过程实战
什么是https? 百度百科足够解释它:http://baike.baidu.com/view/14121.htm 工具:keytool (Windows下路径:%JAVA_HOME%/bin/key ...