转载请注明出处
附上我的博客链接 四元君

引言

对想出AES的前辈大写的佩服,光是写了密钥编排我就写了一下午…这里把AES讲述一下,再把代码过程总结一下

AES密钥扩展原理

AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。

我们这里提及的是构造密钥的方法,密钥扩展,原理如下:

代码构造

首先我们构造RotWord的函数,他的目的在于增加扩散性。这里实际上我们要干的事情就是完成一个置换,做的方式是一个字符串的拼接。注意python内部不能使用word[2:4]之类的方法,只能是word[2:]表示从第2个往后。

def RotWord(word):return word[2:]+word[:2]

接下来构造SubBytes方法。这个方法实现的就是S盒。我们这里的方法是输入字符串,转换为相应的十六进制的字符。Python里不能使用switch方法,只能用字典进行搜索。
对于字典来说,我们可以用key来搜索value。如果没搜索到就默认为None。

numbers = {'0' : '0000','1' : '0001','2' : '0010','3' : '0011','4' : '0100','5' : '0101','6' : '0110','7' : '0111','8' : '1000','9' : '1001','A' : '1010','B' : '1011','C' : '1100','D' : '1101','E' : '1110','F' : '1111'}def hex2Bin(key):return numbers.get(key[0], None)+numbers.get(key[1], None)

当然我们这里还需要的方法,要从value来搜索key,要自定义一个get_key方法:

def get_key (dict, value):for k, v in dict.items():if v == value:return k

接下来实现SubBytes方法,注意原方法中,要先求key在域中的乘法逆,在进行计算。但是计算机内的0指的是第一个元素,所以不必求逆。

def SubBytes(key):#print(key)key=hex2Bin(key)c='11000110'b=''for i in range(8):temp=(int(key[i])+int(key[(i+4)%8])+int(key[(i+5)%8])+int(key[(i+6)%8])+int(key[(i+7)%8])+int(c[i]))%2# print(temp)temp=str(temp)b+=tempb=b[::-1]#print(b)return get_key(numbers,b[:4])+get_key(numbers,b[4:])

再者进行构造SubWord方法,这个方法的目的在于混淆。使用S盒对原序列进行S置换。

def SubWord(word):temp=''i=0while i<len(word):temp+=SubBytes(word[i]+word[i+1])i+=2return temp

最后我们来实现KeyExpansion方法。这里注意在循环中,temp是一个字符串,binnum是一个二进制数。注意不能将二者混用,因为不是每一次temp的值是更新的,在实践中就会出现问题。

def KeyExpansion(m):RCon=['01000000','02000000','04000000','08000000','10000000','20000000','40000000','80000000','1B000000','36000000']i=0key=[]while i<16:key.append(m[i*2]+m[i*2+1])i+=1w=[]for i in range(0,4):w.append(key[4*i]+key[4*i+1]+key[4*i+2]+key[4*i+3])#print(w[i])#temp=SubWord(RotWord(w[0]))#temp=hex2Bin(temp)#temp=w[0]#temp=int(hex2Bin8(SubWord(RotWord(temp))),2)|int(hex2Bin8(RCon[i//4-1]),2)for i in range(4,44):temp=w[i-1]binnum=int(hex2Bin8(temp),2)if(i%4==0):binnum=int(hex2Bin8(SubWord(RotWord(temp))),2)^int(hex2Bin8(RCon[i//4-1]),2)wapp=hex((int(hex2Bin8(w[i-4]),2)^binnum))wapp=wapp[2:].upper()zernum=8-len(wapp)while zernum:wapp='0'+wappzernum-=1w.append(wapp)return w

最后我们将全部的代码放在下面:

def RotWord(word):return word[2:]+word[:2]numbers = {'0' : '0000','1' : '0001','2' : '0010','3' : '0011','4' : '0100','5' : '0101','6' : '0110','7' : '0111','8' : '1000','9' : '1001','A' : '1010','B' : '1011','C' : '1100','D' : '1101','E' : '1110','F' : '1111'}def get_key (dict, value):for k, v in dict.items():if v == value:return kdef hex2Bin(key):return numbers.get(key[0], None)+numbers.get(key[1], None)def hex2Bin8(key):str=''zernum=8-len(key)while zernum:key='0'+keyzernum-=1for i in range(8):str+=numbers.get(key[i], None)#print(str)return strdef SubBytes(key):#print(key)key=hex2Bin(key)c='11000110'b=''for i in range(8):temp=(int(key[i])+int(key[(i+4)%8])+int(key[(i+5)%8])+int(key[(i+6)%8])+int(key[(i+7)%8])+int(c[i]))%2# print(temp)temp=str(temp)b+=tempb=b[::-1]#print(b)return get_key(numbers,b[:4])+get_key(numbers,b[4:])def SubWord(word):temp=''i=0while i<len(word):temp+=SubBytes(word[i]+word[i+1])i+=2return tempdef KeyExpansion(m):RCon=['01000000','02000000','04000000','08000000','10000000','20000000','40000000','80000000','1B000000','36000000']i=0key=[]while i<16:key.append(m[i*2]+m[i*2+1])i+=1w=[]for i in range(0,4):w.append(key[4*i]+key[4*i+1]+key[4*i+2]+key[4*i+3])#print(w[i])#temp=SubWord(RotWord(w[0]))#temp=hex2Bin(temp)#temp=w[0]#temp=int(hex2Bin8(SubWord(RotWord(temp))),2)|int(hex2Bin8(RCon[i//4-1]),2)for i in range(4,44):temp=w[i-1]binnum=int(hex2Bin8(temp),2)if(i%4==0):binnum=int(hex2Bin8(SubWord(RotWord(temp))),2)^int(hex2Bin8(RCon[i//4-1]),2)wapp=hex((int(hex2Bin8(w[i-4]),2)^binnum))wapp=wapp[2:].upper()zernum=8-len(wapp)while zernum:wapp='0'+wappzernum-=1w.append(wapp)return wm='2B7E151628AED2A6ABF7158809CF4F3C'
key=KeyExpansion(m)
key

最后的结果如下:

AES密钥编排Python实现相关推荐

  1. java aes密钥生成_如何在Java(Android)中生成与.Net中相同的AES密钥?

    我需要从.Net WebService提供的salt和密码生成 Java( Android)中的AES密钥.我需要使用与.net生成的密钥相同的密钥和相同的密码和盐(使用Rfc2898DeriveBy ...

  2. rsa1024 java 128 162_关于Java:RSA解密后,无效的AES密钥大小

    我正在尝试解密已使用AES-128对称加密和随后的RSA-1024非对称加密对生成的对称密钥进行加密的消息. 我收到加密的AES密钥和加密的消息,从pfx文件中提取私钥,然后继续对对称密钥进行解密. ...

  3. android怎样生成固定的aes密钥,关于android:如何更改AES 128的密钥数量

    本问题已经有最佳答案,请猛点这里访问. 我找到了一个android加密的源..它使用的是aes 128位加密..但是密钥的数量固定为16个字符..有人能告诉我如何根据我们的意愿更改数字密钥..我不想限 ...

  4. AES密钥与RSA密钥

    AES密钥是什么 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是目前对称密钥加密中比较通用的一种加密方式. AES密钥有什么用 支付宝开放平台所有Op ...

  5. efuse 加密文件 linux,开发者分享 | EFuse AES 密钥验证步骤

    EFuse 具备一次性可编程特性,即只要使用特定密钥将"熔丝 (FUSE)"熔断,就无法再使用任何其他密钥对其进行编程. EFuse 广泛适用于各种量产器件,在本文中我们将为大家演 ...

  6. eFUSE AES 密钥验证步骤

    注:本文转自赛灵思中文社区论坛,源文链接在此.本文原作者为XILINX工程师. 以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教. eFUSE 具备一次性可编程特性,即只要使用特定密钥将" ...

  7. 密码学基础-AES加解密Python代码实现

    接上一篇博客 from Crypto.Cipher import AES from Crypto import Random from binascii import b2a_hex # 要加密的明文 ...

  8. AES加密解密python实现

    1.前言 关于现代密码学算法,可以查看以下博客全面了解 CISSP考试要求里的"应用密码学"内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客 AES的细节知识,可以查阅 AES加密 ...

  9. 用python批量下载modis数据的速度怎么样_MODIS数据的简介和下载(五)——应用密钥的Python脚本下载...

    接上文,由于NASA官方弃用了FTP改用HTTPS服务,所以关于MODIS数据的下载方式有所改变.完整系列博客可以参照以下链接.本篇主要接着上一篇没有讲完的应用密钥的脚本下载介绍. 1 官方教程与说明 ...

最新文章

  1. STL算法中函数对象和谓词
  2. struts數據庫訪問
  3. java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...
  4. C# Socket 编程详解
  5. BayaiM__ oracle函数_01
  6. iOS开发之MAC的内存清理,Xcode清理
  7. 新旧时代的更替——Turbo码/TCM码
  8. 2022 Java IDEA 安装导入JDBC驱动
  9. STM32红外接收分析
  10. Java单例模式——线程安全的懒汉模式
  11. 图像检索:基于内容的图像检索技术
  12. 如何提高kettle在大数据量下的读写速度
  13. 上海市高等学校信息技术水平考试试卷及参考答案
  14. 行走在数据库上的行癫(四)
  15. 锐捷交换机的环路检测
  16. QtEmbedded-4.8.6-arm 字体模糊 图片锐化不清晰
  17. uniapp 图片模糊
  18. javascript开发HTML5游戏--斗地主(单机模式part3)
  19. 用数据分析告诉你这个世界,很有意思!
  20. 做公关必用的四大法宝

热门文章

  1. linux系统修改时区
  2. 作为产品经理,有必要考各种证书吗?比如:pmp,npdp
  3. 分享一个二维码生成的接口,简单好用
  4. 【CHATGPT-3.5】如何使用ChatGPT的同时并学习记忆
  5. 微信小程序 图表chart
  6. c语言的字符数组strlen的详细使用
  7. 线程池基本了解及其参数配置
  8. BK05-蓝鲸智云-标准部署-关键模块逐步操作
  9. JVM 垃圾回收器 ZGC
  10. php实现等比例缩放图片