AES,DES

news2024/9/23 11:21:35

AES加密过程

  1. 初始轮(Initial Round)
  • 将明文分组与初始轮密钥(Round Key)进行XOR运算。
  • 轮运算(Rounds)
  • AES算法中的加密运算是由多轮执行的,每一轮都包含四个基本步骤:字节代换(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。
    • 字节代换(SubBytes):通过一个固定的S盒(Substitution Box)将每个字节替换为另一个字节。
    • 行移位(ShiftRows):对每一行进行循环移位。第一行不变,第二行向左移动一位,第三行向左移动两位,第四行向左移动三位。
    • 列混淆(MixColumns):将每一列视为多项式,然后与一个固定的矩阵进行乘法,结果取模AES的模多项式。
    • 轮密钥加(AddRoundKey):每一轮使用的轮密钥与状态矩阵进行逐比特的XOR运算。
    • 最终轮(Final Round)
    • 在最后一轮中,省略列混淆步骤,只执行字节代换、行移位和轮密钥加。
    • 输出密文(Cipher Text)
    • 经过多轮处理后的状态矩阵即为加密后的密文。

 

 具体步骤

1.定义初始常量

初始常量不同,得到的密钥也不同,我们先规定一个初始常量

#轮常数  
cons1="10000000"  
cons2="00110000"  

# 置换盒  
S_Box = [['9', '4', 'A', 'B'],  
         ['D', '1', '8', '5'],  
         ['6', '2', '0', '3'],  
         ['C', 'E', 'F', '7']]  
# 逆置换盒  
S_deBox = [['A', '5', '9', 'B'],  
           ['1', '7', '8', 'F'],  
           ['6', '0', '2', '3'],  
           ['C', '4', 'D', 'E']]  

mixMatrix = [['1', '4'], ['4', '1']]  
deMixMatrix = [['9', '2'], ['2', '9']]

 2.密钥扩展

原来的密钥需要生成多对子密钥,分别作为各轮加密步骤的子密钥。

==将16位密钥分为左右两部分,每一部分各8位。记原始密钥为第0个密钥。==

在计算第i个密钥时,首先将第i-1个密钥的右半部分(8位)进行左循环移位,即将第i-1个密钥的右半部分的左右4位进行交换,再将左循环移位后的第i-1个密钥的右半部分(8位)进行S盒置换。

进行S盒置换后需要与轮常数进行异或,S-AES的轮常数定义为:第一轮加密的轮常数是【1000 0000】,第二轮加密的轮常数是【0011 0000】。

上述步骤就是示意图中函数g的步骤,将第i-1个密钥的右半部分(8位)执行完上述步骤后得到g(第i-1个密钥的右半部分),将其与第i-1个密钥的左半部分(8位)进行异或得到第i个密钥的左半部分。

第i个密钥的右半部分由第i个密钥的左半部分与第i-1个密钥的右半部分进行异或得到。

具体实现:

#输入初始密钥,输出扩展之后的密钥  
def expandKey(key: str, cons: str, Box: List[List[str]])-> str: 
    rightKey = key[8:]  
    leftKey = key[0:8]  

    # 左边的密钥由右半部分g(i-1)与左半部分异或得到  
    resLeft=xor(G(rightKey,cons,Box),leftKey)  

    # 第i个密钥的右半部分由第i个密钥的左半部分与第i-1个密钥的右半部分进行异或得到  
    resRight=xor(resLeft,rightKey)  
    return resLeft+resRight


#密钥扩展的g函数,  
def G(byteText: str, cons: str, Box: List[List[str]]) -> str:  
    #第一步进行左循环移位,将左右两个进行互换  
    resText=byteText[4:]+byteText[0:4]  

    #第二步进行S盒替代  
    index = 0  
    result = ""  
    while index < len(resText):  
        i = int(resText[index:index + 2], 2)  
        j = int(resText[index + 2:index + 4], 2)  
        result += Box[i][j]  
        index += 4  

    # 十六进制转换二进制  
    result = bin(int(result, 16))[2:].zfill(8)  

    #第三步,与轮常数进行异或  
    result=xor(result,cons)  

    return result

测试

#密钥扩展确认  
cyberText="1010011100111011"  
print("密钥扩展确认")  
print("第一轮加密:" + expandKey(cyberText,cons1,S_Box))  
print("第二轮加密:" + expandKey(expandKey(cyberText,cons1,S_Box), cons2, S_Box))

 结果

3.轮密相加

第零轮加密,也就是对状态矩阵与密钥进行逐位的异或操作

# 轮密钥加密:逐位进行异或操作 输入两个二进制字符串,输出结果=>二进制字符串  
def xor(text1, text2):  
    i = 0  
    restext = ""  
    while i < len(text1):  
        if text1[i] == text2[i]:  
            restext += "0"  
        else:  
            restext += "1"  
        i += 1  
    return restext

 4.半字节代替

# 半字节替代,传入二进制字符串,返回二进制字符串  
def halfByteReplace(text, Box):  
    index = 0  
    result = ""  
    while index < len(text):  
        i = int(text[index:index + 2], 2)  
        j = int(text[index + 2:index + 4], 2)  
        result += Box[i][j]  
        index += 4  

    # 十六进制转换二进制  
    result = bin(int(result, 16))[2:].zfill(16)  
    return result

 因为在这里用到了置换盒,我们需要保证正置换盒和逆置换盒之间是匹配的,所以需要进行测试:

# 置换盒测试程序  
plainText = bin(int("8A1C", 16))[2:]  
print("置换盒测试")  
print(plainText)  
print(hex(int(halfByteReplace(plainText, S_Box), 2)))  
print(hex(int(halfByteReplace(halfByteReplace(plainText, S_Box), S_deBox), 2)))

 运行可以通过

置换盒测试
1000101000011100
0x604c
0x8a1c

5.行位移

# 左循环移位,传入二进制字符串,返回二进制字符串  
def left_shift(text):  
    stateMartix = toStateMartix(text)  

    # 交换  
    tem = stateMartix[1][0]  
    stateMartix[1][0] = stateMartix[1][1]  
    stateMartix[1][1] = tem  

    return reStateMartix(stateMartix)

测试程序

# 行移位测试程序  
print("行移位测试")  
resText = halfByteReplace(plainText, S_Box)  
print(hex(int(left_shift(resText), 2)))
行移位测试
0x6c40

6.列混淆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLaVA: Large Language and Vision Assistant 图片解析

LLaVA: Large Language and Vision Assistant 图片解析 目录 介绍 效果 ​编辑项目 测试代码 Form1.cs Helper.cs 下载 介绍 LLaVA&#xff0c;一种新的大型多模态模型&#xff0c;称为“大型语言和视觉助手”&#xff0c;旨在开发一种通用视觉助手&#xff0c;可以遵…

智慧矿山新趋势:大数据解决方案一览

1. 背景 随着信息技术的快速发展和矿山管理需求的日益迫切&#xff0c;智慧矿山作为一种创新的矿山管理方式应运而生。智慧矿山借助先进的信息技术&#xff0c;实现对矿山生产、管理、安全等各方面的智能化、高效化、协同化&#xff0c;是矿山行业转型升级的必然趋势。 欢迎关…

电子版合同的法律地位-复制品还是替代品?

电子合同与电子版合同并不完全等同&#xff0c;它们之间存在一些关键的区别。以下是对两者的专业解读&#xff1a; 电子合同 定义&#xff1a;电子合同是指完全以电子形式存在的合同&#xff0c;双方或多方通过电子设备进行协商、签署和履行。它不依赖于纸质文件&#xff0c;…

Java基于微信小程序的二手交易系统的实现(V2.0)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python 技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#…

#Linux(文件系统概念)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;查看文件系统情况df&#xff0c;man df查看df命令的功能 &#xff08;2&#xff09;查看文件系统的类型 df-T &#xff08;3&#xff09;df …

前端开发经验分享:写页面时总是有预期之外的滚动条怎么办?

问题描述&#xff1a; 在制作一个页面时常常会出现一些预期之外的滚动条&#xff0c;一般有以下原因&#xff1a;1.内容过多&#xff1a;当容器内的内容&#xff08;如文本、图片等&#xff09;的总高度或总宽度超过容器的可视区域时&#xff0c;滚动条就会出现。2.样式设置&a…

Android Handler使用介绍

Android 中的 Handler 是用来和线程通信的重要工具。它主要用于在后台线程中执行任务&#xff0c;并将结果传递回主线程以更新用户界面。 一、基本概念 线程间通信&#xff1a; Android 应用通常具有主线程&#xff08;也称为 UI 线程&#xff09;和后台线程。Handler 允许您从…

有些商标名称慎加通用词,可能会以误认驳回!

近期看到一网友在30类方便食品申请"某某茶叶"&#xff0c;这个商标名称部分商品通过一部分&#xff0c;另一部分商品以误认驳回&#xff0c;普推知产老杨分析时发现在以前很少出现这种情况&#xff0c;但是近年来商标名称加通用词误认驳回的比较多。 现阶段这种带通…

深度解析ThreadLocal:底层原理、数据隔离与内存泄漏解决

前言 这个问题算是我的一个羞耻点&#xff0c;起源于一次面试中&#xff0c;面试官问ThreadLocal的底层实现是啥&#xff0c;我那时候一直以为ThreadLocal是一个类似于Redis一样的独立于线程外的第三方存储容器&#xff0c;如何底层维护了一个Map结构&#xff0c;以线程ID为Key…

专题一——双指针算法

原理&#xff1a;将数组进行区间划分&#xff0c;通过指针(下标)的移动实现题目所要求的区间&#xff08;数组分块&#xff09; &#xff08;实现代码统一是C&#xff09; 建议在做题与看题解时要自己反复模拟这个实现的过程&#xff0c;以后在做题做到类似的题才能举一反三&am…

QT6实现创建与操作sqlite数据库及读取实例(一)

一.Qt为SQL数据库提供支持的基本模块&#xff08;Qt SQL&#xff09; Qt SQL的API分为不同层&#xff1a; 驱动层 SQL API层 用户接口层 1.驱动层 对于Qt 是基于C来实现的框架&#xff0c;该层主要包括QSqlDriver&#xff0c;QSqlDriverCreator,QSqlDriverCreatorBase,QSqlPlug…

Linux第78步_使用原子整型操作来实现“互斥访问”共享资源

使用原子操作来实现“互斥访问”LED灯设备&#xff0c;目的是每次只允许一个应用程序使用LED灯。 1、创建MyAtomicLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/”目录 输入“mkdir MyAtomicLED回车”&#xff0c;创建MyA…

Python从 Google 地图空气质量 API 获取空气污染数据

获取给定位置当前的空气质量 让我们开始吧!在本节中,我们将介绍如何使用 Google 地图获取给定位置的空气质量数据。您首先需要一个 API 密钥,可以通过您的 Google Cloud 帐户生成该密钥。他们有90 天的免费试用期,之后您将为您使用的 API 服务付费。在开始大量拨打电话之前…

51单片机中断信号的种类及应用场景

在嵌入式系统中&#xff0c;中断是一种重要的事件处理机制&#xff0c;它可以在程序执行的任何时候暂停当前任务&#xff0c;转而执行与之相关的特殊任务或事件。51单片机作为一种常见的微控制器&#xff0c;其中断功能在各种应用中起着关键作用。然而&#xff0c;对于初学者和…

一、SpringBoot基础搭建

本教程主要给初学SpringBoot的开发者&#xff0c;通过idea搭建单体服务提供手把手教学例程&#xff0c;主要目的在于理解环境的搭建&#xff0c;以及maven模块之间的整合与调用 源码&#xff1a;jun/learn-springboot 以商城项目为搭建例子&#xff0c;首先计划建1个父模块&…

部署单节点k8s并允许master节点调度pod

安装k8s 需要注意的是k8s1.24 已经弃用dockershim&#xff0c;现在使用docker需要cri-docker插件作为垫片&#xff0c;对接k8s的CRI。 硬件环境&#xff1a; 2c2g 主机环境&#xff1a; CentOS Linux release 7.9.2009 (Core) IP地址&#xff1a; 192.168.44.161 一、 主机配…

GPT-4 VS Claude3、Gemini、Sora:五大模型的技术特点与用户体验

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…

CTF题型 md5考法例题汇总

CTF题型 md5考法相关例题总结 文章目录 CTF题型 md5考法相关例题总结一.md5弱字符相等()[SWPUCTF 2021 新生赛]easy_md5 二.md5强字符相等()1)文件相等[2024 qsnctf 擂台赛 easy_md5]2)字符相等[安洵杯 2019]easy_web 三.md5哈希长度扩展攻击[NPUCTF2020]ezinclude文件包含利用…

深入技术细节:放弃Spring Security,自己实现Token权限控制!

最近做了个项目&#xff0c;大家都知道很多的项目都是在自己手上原本的框架内进行业务开发。但是甲方爸爸的这个项目需要交付原代码&#xff0c;并且要求框架逻辑简单清晰&#xff0c;二次开发简易上手。 那不是要重新从0到1写一套框架吗&#xff1f; 试着先给甲方爸爸报一下…

美食杂志制作秘籍:引领潮流,引领味蕾

美食杂志是一种介绍美食文化、烹饪技巧和美食体验的杂志&#xff0c;通过精美的图片和生动的文字&#xff0c;向读者展示各种美食的魅力。那么&#xff0c;如何制作一本既美观又实用的美食杂志呢&#xff1f; 首先&#xff0c;你需要选择一款适合你的制作软件。比如FLBOOK在线制…