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 ...
随机推荐
- Selenium Webdriver——操作隐藏的元素(三)switchTo().frame()
在web 应用中经常会遇到frame 嵌套页面的应用,页WebDriver 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的.这个时候就需要通过switc ...
- 总结《二》MFC中WinMain和CALLBACK
MFC中WinMain和回调函数CALLBACK 一,路线 1.一般普通窗口或控件建立调用的CWnd :: CreateEx函数 2.经过资源对话框创建的即不调用的CWnd ...
- uva1330 在一个大的矩阵中寻找面积最大的子矩阵
大白书 P50页 #include <algorithm> #include <cstdio> using namespace std; ; int ma[maxn][maxn ...
- fafu 1413
叉积的运用 ,不断的用叉积去判断 最小的拼图, 刚开始对点进行排序,每个人的排序规则不同做法可能不同,我是按照点的x轴进行x轴相同用y小的在前面,然后每个点按照最下的点开始进行查找 每次从一个点出发然 ...
- EF Code First学习笔记 初识Code First(转)
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...
- linux常用命令:yum 命令
用于添加/删除/更新RPM包,自动解决包的依赖问题以及系统更新升级. 1.命令格式: yum [参数] [软件名]2.命令功能: 功能: yum提供了查找.安装.删除某一个.一组甚至全 ...
- jQuery 是javascript的一个库(常用插件、处理器)
jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery就是javascript的一个库,把我 ...
- python基础七--集合
12.221.昨日内容回顾 小数据池: int:-5--256 str:1.不能有特殊字符 2.*int不能超过20 编码:所能看到的最小构成单位叫字符 ascii : 8位 1字节 表示1个字符 u ...
- 计算概论(A)/基础编程练习2(8题)/2:计算书费
#include<stdio.h> int main() { // 声明与初始化 ; // k组测试数据的总费用 double s[k]; // 单价表 double price[]= { ...
- 来了解一下Ajax是什么?Ajax的原理?Ajax与传统Web比较?Ajax的优缺点?Ajax的Post与Get比较
一.什么是Ajax Ajax(Asynchronous Java and XML的缩写)是一种异步请求数据的web开发技术,对于改善用户的体验和页面性能很有帮助.简单地说,在不需要重新刷新页面的情况下 ...