AES256位加密
目录
1. 算法简介
2. 算法流程
2.1 扩展密钥
2.2 轮密钥加
2.3 字节代替
2.4 行位移
2.5 列混淆
3. 总结
附录A 运算示例
1.算法简介
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES算法属于对称加密算法,是一个分组密码。AES加密算法分为3种,分别是AES-128,AES-192,AES-256。它们之间区别如表1-1所示。
表1-1 3种AES加密算法区别
AES
密钥长度(bit)
分组长度(bit)
加密轮数
AES-128
128
128
10
AES-192
192
128
12
AES-256
256
128
14
本文以最常见的AES-128为例,详细介绍AES加密算法的加密流程。
2.算法流程
AES加密算法主要由4中操作组成:字节代替、行位移、列混淆、轮密钥加。另外还需要对原始密钥进行扩展。主流程图如图2-1所示。
图2-1 AES-128加密算法流程图
加密过程:首先明文进行1次轮密钥加;然后循环9轮字节代替、行位移、列混淆、轮密钥加;注意第10轮没有列混淆。
解密过程:解密过程与加密过程相反,这也是对称加密算法的特点。首先密文进行1次轮密钥加;然后循环9轮逆向行位移、逆向字节代替、轮密钥加、逆向列混淆;注意第10轮没有逆向列混淆。
接下来对每一个流程进行详细介绍。
2.1 扩展密钥
首先对16字节的原始密钥进行扩展,扩展密钥原理图如图2-2所示。
图2-2 扩展密钥原理图
首先需要将16字节原始密钥按列转换成4个32bit的字,即W[0],W[1],W[2],W[3]。
根据原理图和下式依次求解W[j],j=4……43。
函数g如图2-2b所示,具体流程如下:
2.1)将循环左移1字节;
2.2)分别对每个字节按S盒进行映射(S盒见图2-3);
2.3)映射后的值与32bit常量[RC[j/4],0,0,0]进行异或。RC实际只用到后10个字节,RC[0]没有用到,增加RC[0]是为了方便程序中用数组表示。
RC=[0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0x36]
2.2 轮密钥加
在首次进行轮密钥加之前,要对16字节明文进行预处理,将其组成一个4*4的矩阵,然后与初始密钥进行异或运算。之后每次轮密钥加都是与对应扩展的密钥进行异或。
2.3 字节代替
字节代替是通过S盒映射完成的,S盒如图2-3所示。逆向字节代替是通过S盒的逆(S-1)映射完成的。S盒的逆如图2-4所示,其中的值都以16进制表示。
字节代替就是将字节的高4位作为行,低4位作为列,取S盒中对应的行列的值。
例如:字节0x19代替后的值为S(0x19)=S[0x1][0x9]=0xD4;再通过S-1即可替换为原来的值,S-1(0xD4)= S-1 [0xD][0x4]=0x19。
图2-3 S盒(S-box)
图2-4 S盒的逆(Inverse S-box)
2.4 行位移
1)正向行位移
第1行不变
第2行循环左移1字节
第3行循环左移2字节
第4行循环左移3字节
图2-5 正向行位移原理图
2)逆向行位移
第1行不变
第2行循环右移1字节
第3行循环右移2字节
第4行循环右移3字节
2.5 列混淆
利用GF(28)域上算术特性的一个代替。
1)正向列混淆
正向列混淆将数据左乘一个固定矩阵,原理图如图2-6所示。
图2-6 正向列混淆原理图
此处的矩阵乘法不是一般数学意义上的相乘,而是定义在GF(28)上的乘法,需注意以下节点:
a)乘法满足分配率,如07*S0,0=(010203)* S0,0= S0,0(02* S0,0)(04*S0,0)
b)加法为异或运算
c) 乘2就是将二进制左移1位,若原始的值最高位为1,需将移位后的结果异或00011011(若没有移位则不用异或00011011)。
举例:
02*d4=02*(1101 0100)B=(1010 1000)B(0001 1011)B=(1011 0011)B
03*bf=(0102)*bf=01*(1011 1111)B02*(1011 1111)B=(1011 1111)B(0111 1110)B(0001 1011)B=(1101 1010)B
01*5d=(0101 1101)B
01*30=(0011 0000)B
则:(1011 0011)B(1101 1010)B (0101 1101)B (0011 0000)B=04
2)逆向列混淆
逆向列混淆原理图如图2-7所示。他与正向列混淆的差别仅仅是左乘的矩阵不同。正向列混淆与逆向列混淆左乘的矩阵,相乘之后为单位矩阵,所以逆向列混淆可以恢复原文。
3.总结
本文以AES-128为例,详细介绍了AES加密算法的流程,AES-192和AES-256与AES-128相似,只是密钥长度和加密轮数不一样。AES作为对称加密算法,加密和解密用相同密钥;加密速度快,适合用于经常发送数据的场合。
附录A 运算示例
输入消息(16字节):
0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,
0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34
原始密钥(16字节):
0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,
0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c
扩展密钥:
0x2b7e1516 0x28aed2a6 0xabf71588 0x09cf4f3c
0xa0fafe17 0x88542cb1 0x23a33939 0x2a6c7605
0xf2c295f2 0x7a96b943 0x5935807a 0x7359f67f
0x3d80477d 0x4716fe3e 0x1e237e44 0x6d7a883b
0xef44a541 0xa8525b7f 0xb671253b 0xdb0bad00
0xd4d1c6f8 0x7c839d87 0xcaf2b8bc 0x11f915bc
0x6d88a37a 0x110b3efd 0xdbf98641 0xca0093fd
0x4e54f70e 0x5f5fc9f3 0x84a64fb2 0x4ea6dc4f
0xead27321 0xb58dbad2 0x312bf560 0x7f8d292f
0xac7766f3 0x19fadc21 0x28d12941 0x575c006e
0xd014f9a8 0xc9ee2589 0xe13f0cc8 0xb6630ca6
先对明文进行1次轮密钥加
0x19,0x3d,0xe3,0xbe,0xa0,0xf4,0xe2,0x2b,
0x9a,0xc6,0x8d,0x2a,0xe9,0xf8,0x48,0x08
第1轮:
字节代替后:
0xd4,0x27,0x11,0xae,0xe0,0xbf,0x98,0xf1,
0xb8,0xb4,0x5d,0xe5,0x1e,0x41,0x52,0x30
行位移后:
0xd4,0xbf,0x5d,0x30,0xe0,0xb4,0x52,0xae,
0xb8,0x41,0x11,0xf1,0x1e,0x27,0x98,0xe5
列混淆后:
0x04,0x66,0x81,0xe5,0xe0,0xcb,0x19,0x9a,
0x48,0xf8,0xd3,0x7a,0x28,0x06,0x26,0x4c
第2轮-第10轮
原文链接:https://blog.csdn.net/u013073067/article/details/86529111
AES256位加密的更多相关文章
- C#之AES256位加密解密
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分 ...
- 原创:MD5 32位加密软件
网站后台数据库切勿使用明文保存密码,否则一旦黑客拿下你的Webshell,后果不堪设想. 网站后台密码加密大多数采用的就是MD5算法加密.今天给大家送一个本人用c#简单编写的MD5 32位加密程序,虽 ...
- MD5实现32位加密
好记性不如烂笔头,随手记记 附代码 public static void Main(string[] args) { Console.WriteLine("长度为" + UseMd ...
- 在java项目中使用AES256 CBC加密
首先要注意一点,默认的JDK是不支持256位加密的,需要到Oracle官网下载加密增强文件(Java Cryptography Extension (JCE) Unlimited Strength J ...
- MD5 32位、16位加密
/// <summary> /// MD5 16位加密 /// </summary> /// <param name="ConvertString"& ...
- 字符串的MD5的32位加密和16位加密
import java.security.MessageDigest; import java.util.Locale; public class MD5Util { public static St ...
- base64位加密解密
1.base64位加密base64是用于传输8Bit字节代码,由上图的编码表可以知道,编码后的内容只包含这64个字符类型,所以称为base64编码 2.编码过程 : 首先将待编码的内容转换成8位二进制 ...
- iOS关于md5 32位加密
导入头文件: #import <CommonCrypto/CommonDigest.h> //md5 32位 加密 (小写)- (NSString *)md5:(NSString *)st ...
- php AES cbc模式 pkcs7 128位加密解密(微信小程序)
PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456'; $message = '12345 ...
随机推荐
- 复杂sql优化步骤与技巧
数据管理型系统,由于用户的要求或者系统设计要求,会出现大量表进行join,还要进行大量统计性数据查询展示,甚至数据权限控制等操作.最后会导致sql异常复杂,随着数据量增加,或者只是应用到生产环境(正式 ...
- php的lareval框架配置出错
前两天,在学习php的 lareval 框架时,从官网上下载完lareval的安装包后,按照网上的配置教程一点一点的配置完后,当点击public 文件运行时就出现一个让我很头痛的问题,我自己外加两个大 ...
- NoSQL数据库技术实战-第1章 NoSQL的数据一致性 传统关系型数据库的ACID
在看着章节的时候,我简单的回顾了一下关系型数据库的事务处理的ACID原则,其中原子性和持久性比较好理解.由于以前没有深入去研究.关于一致性和隔离性上我产生了疑问,在整理后分析如下: 一致性:书中所 ...
- Hadoop-No.13之数据源系统以及数据结构
文件系统中采集数据时,应该考虑以下内容. 数据源系统设备的读取速率 在所有处理流水线中,磁盘I/O通常都是主要瓶颈.但是优化采集流程时通常要看一下检索数据的系统系统.一般来说,Hadoop的读取速度在 ...
- charindex函数--->检索字符在字符串中的起始位置
语法:CHARINDEX(检索字符,被检索字符串) 返回值:检索字符在被检索字符串中的起始位置.
- 【Winfrom-Button】 重写Button,去掉获取焦点时的边框
Winfrom Button 去掉获取焦点时的边框: 自定义一个Button,重写ShowFocusCues方法 /// <summary> /// 去掉获取焦点的边框 /// </ ...
- 对Webpack 应用的研究-----------------引用
对大多数 Web 应用来说,页面性能直接影响着流量.这是一个经常为我们所忽视的事实.用户长时间的等待流失的不仅仅是跳出率.转化率,还有对产品的耐心和信赖.很多时候我们没有意识到性能问题,那是因为平常开 ...
- Mysql存储时间字段
兄弟连教育数据库培训教程 Mysql存储时间字段用int.timestamp还是datetime 通常存储时间用datetime类型,现在很多系统也用int存储时间,它们有什么区别?总结如下: int ...
- Jmeter接口测试之用例数据分离
之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...
- hdu 5834 四面体 观察+暴力
Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 13107 ...