aes加密算法

C语言 AES算法 加密解密 C语言 实现 AES 128 位加密解密 1、调用函数 #include "stdio.h" #include "stdlib.h" #include <string.h> #include "aes.h" extern OL_APITABLE_T *AP_interface; typedef struct{ uint32_t eK[44], dK[44]; // encKey, decKey int Nr; // 10 rounds }AesKey; #d 阅读详情

波士顿大学的Howard Straubing做了这么一个动画来展示AES加密算法的演示,没有文字那么难理解,在理解了大概流程后可以对细节方面了解,例如什么是GF,轮密码怎么生成怎么来的,S-盒又是怎么定义之类的。

---------------------------------------------------------------------------------


0 AES简介

  美国国家标准技术研究所在2001年发布了高级加密标准(AES)。AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准。

  根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128、AES-192和AES-256。

1 算法流程

  AES加解密的流程图如下(以128位密钥为例):

技术分享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


AES加密过程涉及到4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

  AES算法中,密钥扩展也是理解AES算法的关键,接下来分别对上述5种操作进行介绍。

1.0 预备知识:有限域GF(2^8)的加法和乘法 

AES 加密算法使用相当简单明了的技术来代替和置换,除 MixColumns 例程以外。MixColumns 使用特殊的加法和乘法。AES 所用的加法和乘法是基于数学(译者注:近世代数)的域论。尤其是 AES 基于有限域GF(2^8)。 
  GF(2^8)由一组从 0x00 到 0xff 的256个值组成,加上加法和乘法,因此是(2^8)。GF代表伽罗瓦域,以发明这一理论的数学家的名字命名。GF(2^8) 的一个特性是一个加法或乘法的操作的结果必须是在{0x00 ... 0xff}这组数中。虽然域论是相当深奥的,但GF(2^8)加法的最终结果却很简单。GF(2^8) 加法就是异或(XOR)操作。 
  然而,GF(2^8)的乘法有点繁难。AES的加密和解密例程需要知道怎样只用七个常量 0x01、0x02、0x03、0x09、0x0b、0x0d 和 0x0e 来相乘。所以我不全面介绍GF(2^8)的乘法,而只是针对这七种特殊情况进行说明。 
  在GF(2^8)中用0x01的乘法是特殊的;它相当于普通算术中用1做乘法并且结果也同样—任何值乘0x01等于其自身。 
  现在让我们看看用0x02做乘法。和加法的情况相同,理论是深奥的,但最终结果十分简单。只要被乘的值小于0x80,这时乘法的结果就是该值左移1比特位。如果被乘的值大于或等于0x80,这时乘法的结果就是左移1比特位再用值0x1b异或。它防止了“域溢出”并保持乘法的乘积在范围以内。 
一旦你在GF(2^8)中用0x02建立了加法和乘法,你就可以用任何常量去定义乘法。用0x03做乘法时,你可以将 0x03 分解为2的幂之和。为了用 0x03 乘以任意字节b, 因为 0x03 = 0x02 + 0x01,因此: 
b * 0x03 = b * (0x02 + 0x01) = (b * 0x02) + (b * 0x01)

这是可以行得通的,因为你知道如何用 0x02 和 0x01 相乘和相加,同理,用0x0d去乘以任意字节b可以这样做:

b * 0x0d   = b * (0x08 + 0x04 + 0x01) 

= (b * 0x08) + (b * 0x04) + (b * 0x01) 

= (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x01)

在加解密算法中,AES MixColumns 例程的其它乘法遵循大体相同的模式,如下所示: 

b * 0x09   = b * (0x08 + 0x01) 

= (b * 0x02 * 0x02 * 0x02) + (b * 0x01)b * 0x0b 

= b * (0x08 + 0x02 + 0x01) 

= (b * 0x02 * 0x02 * 0x02) + (b * 0x02) + (b * 0x01)b * 0x0e 

= b * (0x08 +0x04 + 0x02) 

= (b * 0x02 * 0x02 * 0x02) + (b * 0x02 * 0x02) + (b * 0x02)  

总之,在GF(2^8)中,加法是异或操作。其乘法将分解成加法和用0x02做的乘法,而用0x02做的乘法是一个有条件的左移1比特位。AES规范中包括大量有关GF(2^8)操作的附加信息。

1.1 密钥扩展

密钥扩展的原理图如下:

 技术分享


w[]最初的 Nk 行被作为种子,用原始密钥值。剩余行从种子密钥来产生。变量 Nk 代表以 32 位字为单位的种子密钥长度。关键是这里现在有许多密钥使用而不只是一个。这些新的密钥被称为轮密钥(round keys)以将它们与原始种子密钥区别开来。

  密钥扩展过程说明:(以128位密钥为例,Nk=4,Nr=10)

    1)  将初始密钥以列为主,转化为4个32 bits的字,分别记为w[0…(Nk-1)];

    2)  按照如下方式,依次求解w[j],其中j是整数并且属于[4,K];(K=Nb*(Nr+1),Nb=4,Nr为轮数,128位密钥对应的Nr=10)

    3)  若j%4=0,则w[j]=w[j-4]⊕g(w[j-1]),否则w[j]=w[j-4]⊕w[j-1];

  函数g的流程说明:

    4)  将w循环左移一个字节;

    5)  分别对每个字节按S盒进行映射;

    6)  与32 bits的常量(RC[j/4],0,0,0)进行异或,RC是一个一维数组,其值如下。(RC的值只需要有10个,而此处用了11个,实际上RC[0]在运算中没有用到,增加RC[0]是为了便于程序中用数组表示。由于j的最小取值是4,j/4的最小取值则是1,因此不会产生错误。)

      RC = {00, 01, 02, 04, 08, 10, 20, 40, 80, 1B, 36}


算法操作流程:  

AES 加密例程开始是拷贝 16 字节的输入数组到一个名为 State (态)的4×4 字节矩阵中。AES 加密算法取名为 Cipher,它操作 State[]。

SubBytes、ShiftRows、MixColumns 和 AddRoundKey 四个操作在一个执行 Nr 次的循环里被调用,Nr 为给定密钥大小的轮数减 1。加密算法使用的轮数要么是10,12,要么是14,这依赖于种子密钥长度是128位、192 位还是 256 位。

1.1 字节代替

  字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。

  下图(a)为S盒,图(b)为S-1(S盒的逆)。

技术分享

技术分享

  S和S-1分别为16x16的矩阵。假设输入字节的值为a=a7a6a5a4a3a2a1a0,

则输出值为S[a7a6a5a4][a3a2a1a0],S-1的变换也同理。

  例如:字节00替换后的值为(S[0][0]=)63,再通过S-1即可得到替换前的值,(S-1 [6][3]=)00。

1.2 行移位

  行移位的功能是实现一个4x4矩阵内部字节之间的置换。

1.2.1 正向行移位

  正向行移位的原理图如下:

技术分享

  实际移位的操作即是:第一行保存不变,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节。假设矩阵的名字为state,用公式表示如下:state’[i][j] = state[i][(j+i)%4];其中i、j属于[0,3]

1.2.2 逆向行移位

  逆向行移位即是相反的操作,用公式表示如下:state’[i][j] = state[i][(4+j-i)%4];其中i、j属于[0,3]

1.3 列混淆

  列混淆:利用GF(28)域上算术特性的一个代替。

1.3.1 正向列混淆

  正向列混淆的原理图如下:

技术分享

  根据矩阵的乘法可知,在列混淆的过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法都是定义在GF(28)上的,需要注意如下几点:

    1) 将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果该值的最高位为1(表示该数值不小于128),则还需要将移位后的结果异或00011011(0x1b);

    2) 乘法对加法满足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)

    3) 此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模2加法(相当于是异或运算)。

  假设某一列的值如下图,运算过程如下:

  技术分享  

  技术分享

  同理可以求出另外几个值。

1.3.2 逆向列混淆

  逆向列混淆的原理图如下:

 技术分享

  由于:

 技术分享

说明两个矩阵互逆,经过一次逆向列混淆后即可恢复原文。

1.4 轮密码加

  任何数和自身的异或结果为0。加密过程中,每轮的输入与轮密钥异或一次;因此,解密时再异或上该轮的密钥即可恢复输入。

2 源码(以256密钥为例)

https://github.com/yangxt225/AES

参阅:

http://www.mamicode.com/info-detail-514466.html
http://wenku.baidu.com/view/97a8d94dfe4733687e21aabc.html?re=view
http://blog.youkuaiyun.com/yxtxiaotian/article/details/52084123
AES128加密算法完整实现 概述 原本想把自己AES加密算法的整个实现过程给详细复述下来,分享给想学习的同学,也方便自己复习,但后来发现该工作量太大,加上作业太多没有过多的时间去写。所以就想把自己在学习的过程中多遇到的好的文章进行汇总,避免重复性的工作,因为我感觉有的文章的介绍和配图写的非常好,再次重复也没有意义。本文里我会将文章的链接附上,如有侵权,敬请告知! 因为最近要完成课程作业,实现AES128加解密... 阅读详情

相关推荐

AES加密算法(带示例)

原创不易,转载请注明出处。 目录 1. 算法简介 2. 算法流程 2.1 扩展密钥 2.2 轮密钥加 2.3 字节代替 2.4 行位移 2.5 列混淆 3. 总结 附录A 运算示例 1.算法简介 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加...

u013073067的博客 2万+

AES加密解密

AES加密解密

u013021184的博客 7789

对称加密之AES加密算法

对称加密之AES加密算法 AES加密算法(Advanced Encryption Standard) 算法说明: 上一篇介绍DES算法时已经说到,尽管DES算法本身并无设计缺陷,但由于计算硬件的飞速发展,DES的56位密钥空间已经无法经受住高速密钥穷举攻击。为扩展密钥空间,168位密钥空间的三重DES后来被广泛应用,但三次DES串行加密也有明显的弊端,那就是加解密效率的降低。 ...

Hsuyeungpeng的专栏 1万+

AES加密解密算法

AES属于分组加密,算法明文长度固定为128位(单位是比特bit,1bit就是1位,128位等于16字节)而密钥长度可以是128、192、256位当密钥为128位时,需要循环10轮完成加密,在此基础上,密钥每增加64位,就要多循环2轮(即192位密钥循环12轮,256位密钥循环14轮)

这个博主不懒,但Ta什么也没写~(私信互关24小时必回) 2万+

AES加密算法工作原理

密码学博大精深,这里所说的AES加密算法原理可以理解为AES工作流程,至于为什么这么设计,这么设计为什么是安全的,有待今后的学习与思考。 分组密码设计的两个原则 分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。 混淆是使密文的统计特性与密钥的取值之间的关系 尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法...

内核思考 4008

AES(高级加密标准):AES的加解密过程分析

AES, 或称高级加密标准,是由美国国家标准与技术研究院(NIST)在2001年正式采纳的一种对称密钥加密算法。它取代了之前的DES和3DES标准,成为全球广泛使用的加密标准。AES的开发始于1997年,由比利时密码学家Joan Daemen和Vincent Rijmen设计,最初称为Rijndael算法。NIST在经过一系列的评估和测试后,选择了Rijndael作为新的加密标准,主要因为它在安全性、效率、灵活性和易于实现方面表现优异。

kkchenjj的博客 2870

AES加密算法基于python实现

AES加密算法 AES是对称加密算法,本文实现的是128bit密钥的Rijndael算法 采用的语言:python 参考了Python实现AES加密算法(无第三方库)一些基本数据直接复制了过来 加密 一、 基本运算 1. 字节代替subBytes----------用一个S盒完成分组中的按字节的代替 2. 行移位shiftRows-----------一个简单的置换 3. 列混淆mixColumns----------一个利用在域GF(2^8)上的算数特性的代替 4. 轮密钥加addRoundKey----

胖手探长的博客 9043

Yocto下载加速秘籍:用清华镜像+PREMIRRORS配置让构建速度翻倍

本文详细解析了如何通过配置Yocto的PREMIRRORS优先级策略,并利用清华大学等国内镜像源,显著加速构建过程中的源码下载。文章提供了具体的配置示例和验证方法,帮助开发者解决网络瓶颈,实现构建速度翻倍,提升开发效率。

game4的博客 275

AES加密算法

AES加密算法 什么是AES加密算法? AES算法全称是Advanced Encryption Standard, 是DES算法的替代者,是当今最流行的对称加密算法之一 什么是对称加密算法? 对称加密:双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密。 优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。 缺点:在数据传送前,发送方和接收方必须商定好秘钥,然后 使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么

DataWizard 3371

2022-04-06 RK3566 上调试百兆以太网卡YT8512C 调试记录

一、原理图 二、dts &gmac1_clkin{ clock-frequency = <50000000>; status = "okay"; }; &gmac1 { phy-mode = "rmii"; clock_in_out = "input"; snps,reset-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>; snps,reset-active-low; sn...

海月汐辰 1万+

【科研绘图】【数据拟合曲线】:附Origin详细画图流程

拟合曲线图

weixin_50236590的博客 4万+

Java实现AES加密算法

最近恶补了一些关于加密算法的知识,然后用编程语言来实现 AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义: 明文P 没有经过加密的数据 密钥K 用来加密明文的密码,在对称加密...

mathor的博客 2万+

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3286

什么是AES加密?详解AES加密算法原理流程

AES是高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,目前已经被全世界广泛使用,同时AES已经成为对称密钥加密中最流行的算法之一。AES支持三种长度的密钥:128位,192位,256位。

xnxqwzy的博客 7336

一文了解ECU软件刷写的2种方法:Bootloader刷写和调试器刷写

分为刷写前、刷写中和刷写后三个阶段,如下示意:下面我们来详细了解一下Bootloader收到外部请求后开始刷写的三个阶段1)刷写前进行刷写的准备,一是确保刷写阶段总线通信的稳定性,二是避免刷写阶段出现非预期的故障,三是读取车辆数据供刷写前的一些检查等,如下所示:首先进行会话控制,通过功能寻址方式进入扩展会话模式,为后面的信息访问及其他指令做准备;然后检查刷写的前提条件,通过物理寻址方式发送历程控制请求。比如车确实处于静止状态,供电电压稳定等条件下才允许刷写;

menghuyouyou的博客 5778

四款办公Agent实测对比:WorkBuddy、千问办公、库库AI、豆包工作怎么选

AI Agent是一种能感知环境、自主决策并执行动作的智能系统,其核心在于工具调用、状态管理与错误恢复构成的执行闭环。在办公场景中,任务边界清晰、容错率高、重复性强,使Agent成为最容易落地的方向。通过调用本地文件、脚本或办公套件,Agent能自动完成文件批量处理、文档摘要、会议纪要等重复劳动,显著提升工作效率。目前WorkBuddy、千问办公、库库AI、豆包工作等产品分别从本地操作、办公套件嵌入、知识处理、轻量助手等路线切入,用户可根据自身场景选择。

weixin_29052717的博客 519

AES加密算法及逆向

AES加密算法就是众多对称加密算法中的一种,它的英文全称是Advanced Encryption Standard,翻译过来是高级加密标准,它是用来替代之前的DES加密算法的。AES加密算法采用分组密码体制,明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位),根据密钥的长度,算法被称为AES-128,AES-192或者AE-256。一共有四种加密模式,我们通常采用需要初始向量IV的CBC模式,初始向量的长度也是128位16个字节。

megaparsec 1万+

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 511

浅谈加密算法 aes

一、目标 搞了这么多期签名和加密解密,今天我们聊聊高大上的东西: 加密算法。 加密算法我们整体可以分为:不可逆加密算法和可逆加密算法。 不可逆加密算法 常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512。他们的特点是,不能从加密后的结果解密出原文,主要用于校检数据的一致性,防止篡改数据,我们之前分析的大部分sign签名都是不可逆算法。也叫散列算法或者哈希算法。 可逆加密算法 可逆加密算法就是加密之后的密文可以解密出原文。又可以分为:非对称加密和

fenfei331的博客 1万+

Zephyr内核——内存管理——内存堆

Zephyr提供了一组允许线程动态分配内存。

wayne2018的博客-心情驿站 771

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

了解AES加密算法

在信息安全的世界里,AES(Advanced Encryption Standard,高级加密标准)是一个绕不开的名字。它被广泛应用于数据加密,从 HTTPS 安全通信到磁盘加密,几乎无处不在。

常备不懈 1898

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

AES加密算法原理详解

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:明文p::::info没有经过加密的数据。:::密钥K::::info用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。

dingxingaq的博客 2757

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

AES加密算法详解(图文解释)

由于DES加密算法被破解了,3DES加密算法虽然没有被破解,但是3DES算法的加解密效率低,所有现在都使用AES算法。 AES加密算法是密码学中的高级加密标准,AES为分组加密法,把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文,在AES标准规范中,分组长度只能是128位,AES是按照字节进行加密的,也就是说每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。这导致密钥长度不同,推荐加密的轮数也不同。 AES算法思想: 1)设计简单; 2)在多个平台

weixin_44565944的博客 4万+

【加密算法】AES

很早之前做的笔记,找不到是哪位大佬分享的了 哈希摘要算法:MD5,SHA,不可逆 对称加密算法:AES,可逆(DES的替代者) 1.密钥 密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。 AES支持三种长度的密钥: 128位,192位,256位 平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不...

Sam-zhang的博客 1万+

AES 加密算法原理详解及实现

随着互联网的发展,越来越多的数据需要在网络中进行传输。为了保证数据的安全性,在进行网络传输时,需要对数据进行加密操作,使得数据在传输过程中不被窃取或篡改。AES(Advanced Encryption Standard)就是一种经典的加密算法。AES 算法源于比利时密码学家 Joan Daemen 和 Vincent Rijmen,它是一种对称加密算法,通过使用相同的密钥对数据进行加密和解密操作。AES 算法中,加密和解密操作是相反的过程,因此需要使用相同的密钥作为加密和解密的关键参数。

兴趣是最好的老师,勤能补拙 1万+
上一篇: 纪念第一个项目吧
下一篇: 拉格朗日插值
BIGKAKA
博客等级 码龄11年 32粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值