AES算法

算法简介

AES本质是一种对称分组密码体制,采用代替/置换网络。每轮由三层组成:线性混合层确保多轮之上的高度扩散,非线性层由16个S盒并置起到混淆的作用,秘钥加密层将子秘钥异或到中间状态。

AES加密数据块和秘钥长度可以是128比特,192比特,256比特,AES加密有很多轮的重复和变换。

大致步骤如下:

  • 1、秘钥扩展(KeyExpansion)
  • 2、初始化轮(Initial Round)
  • 3、重复轮(Rounds),每一轮又包括:SubBytes,ShiftRows,MixColumns,AddRoundKey
  • 4、最终轮(Final Round),最终轮没有MixColums)
    在这里插入图片描述

AES的轮函数

字节代换 (SubBytes)

非线性代换,独立地对状态的每个字节进行,并且代换表(S盒)可逆,记为ByteSub(State),分两步:

  • (1)将字节作为GF(28)上的元素映射到自己的逆元
  • (2)将字节做GF(2)上的放射变换,即 y=Ax-1+B,其中A是一个GF(2)上8☓8的可逆矩阵,B是GF(2)上一个8位列向量

在这里插入图片描述
AES的S盒
在这里插入图片描述
S盒的使用:输入8a,输出就是7e

在这里插入图片描述

逆字节代换

逆字节替代变换是字节替代变换的逆变换,在状态的每个字节上应用逆S盒
y=A-1(x-B)
输入7e,输出8a
在这里插入图片描述
上述S-盒对状态的所有字节所做的变换记为ByteSub (State)
在这里插入图片描述

行移位(ShiftRow)

将状态阵列的各行进行循环移位,不同行的移位量不同:

  • 0行:不动
  • 1行:循环左移C1字节
  • 2行:循环左移C2字节
  • 3行:循环左移C3字节

在这里插入图片描述

算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵阵列表示,该阵列有4行,列数Nb为分组长度除32,可看成字节组成的一维数组。
Nb=6的状态阵列
在这里插入图片描述

行移位示意图:
在这里插入图片描述

逆行移位

逆行移位变换是行移位变换的逆变换,它对状态的每一行进行循环右移

  • 第0行保持不变
  • 第1行循环右移C1个字节
  • 第2行循环右移C2个字节
  • 第3行循环右移C3个字节
列混淆(MixColumn)

将每列视为GF(28)上多项式,与固定的多项式c(x)进行模x4+1乘法,要求c(x)模x4+1可逆。

在这里插入图片描述
列混淆运算也可写为矩阵乘法。
在这里插入图片描述
示意图:
在这里插入图片描述

轮密钥加(AddRoundKey)

轮密钥与状态进行逐比特异或。轮密钥由种子密钥通过密钥编排算法得到。轮密钥长度与分组长度相同

密钥编排

密钥编排指从种子密钥得到轮密钥的过程,它由密钥扩展和轮密钥选取两部分组成。其基本原则如下:

  • (1)轮密钥的比特数等于分组长度乘以轮数加1;例如要将128比特的明文经过10轮的加密,则总共需要(10+1)*128=1408比特的密钥。
  • (2)种子密钥被扩展成为扩展密钥;
  • (3)轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前Nb个字,第2轮轮密钥取接下来的Nb个字,如此下去。
密钥扩展

扩展密钥是以4字节字为元素的一维阵列,表示为W[Nb* (Nr+1)],其中前Nk个字取为种子密钥,以后每个字按递归方式定义。扩展算法根据Nk≤6和Nk>6有所不同。

种子密钥:以字节为元素的矩阵阵列描述,阵列为4行,列数Nk为密钥长度除32
Nk=4的情况:在这里插入图片描述

在这里插入图片描述
Nk<=6
在这里插入图片描述
在这里插入图片描述

轮密钥选取

轮密钥i(即第i 个轮密钥)由轮密钥缓冲字W[Nb* i]到W[Nb*(i+1)]给出,如图所示。
在这里插入图片描述

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

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

相关文章

C——结构体

例题1&#xff1a;(使用结构体) 输入两个学生的学号、姓名和成绩&#xff0c;输出成绩较高的学生的学号、姓名和成绩 解题思路&#xff1a; (1)定义连个结构相同的结构体变量student1,student2; (2)分别输入两个学生的学号、姓名、和成绩&#xff1b; (3)比较两个学生的成…

web.config配置文件详解

<?xml version"1.0"?> <!--注意: 除了手动编辑此文件以外&#xff0c;您还可以使用 Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的“网站”->“Asp.Net 配置”选项。 设置和注释的完整列表在 machine.config.comments 中&#xff0c…

离散数学群论_离散数学中的群论及其类型

离散数学群论半群 (Semigroup) An algebraic structure (G, *) is said to be a semigroup. If the binary operation * is associated in G i.e. if (a*b) *c a *(b*c) a,b,c e G. For example, the set of N of all natural number is semigroup with respect to the operat…

IDA使用方法-----1

0x01 启动IDA new&#xff1a;反汇编一个新文件go&#xff1a;运行&#xff0c;直接进入IDAPrevious&#xff1a;载入一个我们以前编译过的程序 如果不想每次都看到这个对话框&#xff0c;可以取消该对话框底部的Display at startup&#xff08;启动时显示&#xff09;&#x…

邮箱验证JS代码

方法一,用JSfunction finish_onclick() { var username document.getElementById("username");var pwhidden document.getElementById("pwhidden");if(username.value"") { alert("请填写您的企业邮箱地址&#xff01;");username.f…

objdump命令详解

objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。 选项 --archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname --targetbfdname 指定目标码格式。这不是必须的&#xff0c;objdump能自动识别许多格式&#xff0c;比如…

Java——异常(try...catch...finally)

public class Demo5_Throwable {public static void main(String[] args) {try{System.out.println(1/0);}catch(Exception e){System.out.println(e.getMessage());//获取异常信息,返回字符串&#xff1b;System.out.println(e.toString());//获取异常类名和异常信息&#xff…

Python程序反转给定数字(2种不同方式)

Take input number from the user and print its reverse. 从用户处获取输入号码并打印其反面。 Example: 例&#xff1a; Input:12345Output:54321Here, we are implementing program to reversing a given number using 2 different ways. 在这里&#xff0c;我们正在实施程…

外汇期货学习专帖(转)

一篇好文,值得深思! (转) 我的一些所看所想,和大家聊聊 ; d: R ^6 c* A2 e X" y8 y4 Bhttp://www.fx998.cn 说来惭愧,很久以前,俺在期货公司混事,95年以前国内期货公司从外盘棉花到咖啡....,外汇期指到原油.都能*作.是一派欣欣向荣之景.95年之后,按国家规定都转了内…

《Pro ASP.NET MVC 3 Framework》学习笔记之四【领域模型介绍】

主题&#xff1a;应用领域驱动开发(Applying Domain-Driven Development) Domain Model是MVC程序的"心脏"&#xff0c;其他的一切&#xff0c;包括Controllers和Views仅仅是用来跟Domain Model交互的一种方式&#xff0c;ASP.NET MVC并没有限制使用在Domain Model上面…

Java——集合框架(List)

集合框架&#xff08;List的三个子类的特点&#xff09; A&#xff1a;List的三个子类的特点 ArrayList&#xff1a; 底层数据结构是数组&#xff0c;查询快&#xff0c;增删慢。 线程不安全&#xff0c;效率高。 Vector&#xff1a; 底层数据结构是数组&#xff0c;查询…

一步一步学pwntools(适合新手)

序 pwntools是一个二进制利用框架。官方文档提供了详细的api规范。然而目前并没有一个很好的新手教程。因此我用了我过去的几篇writeup。由于本文只是用来介绍pwntools使用方法&#xff0c;我不会过于详细的讲解各种二进制漏洞攻击技术。 Pwntools的“Hello World” 栈溢出无…

关于J2EE中死锁问题的研究(1)

大多数重要的应用程序都涉及高度并发性和多个抽象层。并发性与资源争用有关&#xff0c;并且是导致死锁问题增多的因素之一。多个抽象层使隔离并修复死锁环境的工作变得更加困难。 通常&#xff0c;当同时执行两个或两个以上的线程时&#xff0c;如果每个线程都占有一个资源并请…

python变量分配内存_Python | 声明任何变量而不分配任何值

python变量分配内存Since, Python is a dynamic programming language so there is no need to declare such type of variable, it automatically declares when first time value assign in it. 由于Python是一种动态编程语言&#xff0c;因此无需声明此类变量&#xff0c;它…

UVA 10004 - Bicoloring

模拟染色&#xff0c;因为只有两种颜色&#xff0c;所以分别用 0、 1 代表这两种颜色&#xff0c;然后从0开始深搜&#xff0c;如果 每个点都能染上色&#xff0c;且相邻两点的颜色不同&#xff0c;则符合要求。 #include<stdio.h>#include<string.h>#define MAXN …

标志寄存器:CF、PF、AF、ZF、SF、TF、DF、OF

注&#xff1a;下面说到的标志寄存器都是缩写&#xff0c;C就是CF&#xff0c;其他也一样 标志寄存器&#xff1a;C、P、A、Z、S、T、D、O的内容只会是0或1&#xff0c;0表示假&#xff0c;1表示真 O&#xff1a;溢出标志 一个寄存器如果存放的值超过所能表示的范围&#xf…

揭秘:销售人员26个致命弱点

销售人员有许多积极的态度需要学习&#xff0c; 同时也有许多不良的习惯应该避免&#xff0c;以免影响个性及专业能力。仔细看看这些缺点&#xff0c;反省你自己&#xff0c;还需要改善的画&#xff0c;直到你给自己一百分为止。找一位深知你的好 友&#xff0c;让他诚实地给你…

Java——集合(练习题)

例题1&#xff1a;产生10个1~20之间的随机数&#xff0c;要求随机数不能重复 import java.util.HashSet; import java.util.Random; public class Test1 {/*** 产生10个1~20之间的随机数&#xff0c;要求随机数不能重复* * 分析&#xff1a;* 1,有Random类创建随机数对象* 2&a…

模块化 组件化 工程化_软件工程中的模块和软件组件

模块化 组件化 工程化The module in software is a small part of the software that is responsible for performing any kind of functionality. Sometimes, the term sub-program is also used to refer to the term module. 软件中的模块是软件的一小部分&#xff0c;负责…

Firefox2狂占CPU解决办法

https://images.cnblogs.com/cnblogs_com/Tisty/138006/o_firefox3.jpg 看了一下&#xff0c;不知道 "jpeg_free_large" 是干啥的&#xff0c;遂用 "Firefox jpeg_free_large" Google 一下&#xff0c;出来的一堆东西里有帖子说可能和 Apple 的 QuickTime …