aes算法图文介绍

AES算法简介

一、 AES的结构

 

转自https://www.cnblogs.com/OneFri/p/5924605.html

1、总体结构

明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位)。根据密钥的长度,算法被称为AES-128,AES-192或者AE-256。

clip_image002

2、明文密钥组织方式

(@2CQP15US3}R09LZ7F8RRN

 

3、一些相关的的术语定义和表示

• 状态(State):密码运算的中间结果称为状态。

• State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb。 Nb=分组长度(bits)÷ 32。Nb可以取的值为4,对应的分组长度为128bits。

• 密码密钥(Cipher Key)的表示: Cipher Key类似地用一个4行的矩阵阵列来表示,列数记为Nk。Nk=密钥长度(bits)÷32。Nk可以取的值为4,6,8,对应的密钥长度为128, 192, 256 bits。

 

4、详细过程

由四个不同的变换组成,包括一个置换和三个替代:

字节代替(SubBytes): 用一个S盒完成分组的字节到字节的代替。

行移位(ShiftRows):一个简单的置换。

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

轮密钥加(AddRoundKey):当前分组和扩展密钥的一部分进行按位XOR(异或)。

clip_image006

输入的密钥被扩展成由44个32位子所组成的数组w[i],由上图可知,每轮有四个不同的字(128位)作为该轮到密钥。

对加密和解密的操作,算法由轮密钥加开始,接着执行9轮迭代运算,每轮都包含所有4个阶段的代替,接着是第10轮的三个阶段。

仅仅在轮密钥加阶段使用密钥。由于这个原因,该算法以轮密钥加开始,以轮密钥加结束。

 

二、AES的变换函数

 

1、字节替代

正向和逆向变换。被称为字节代替的正向字节代替变换是一个简单的查表操作。

映射方式:把该字节的高4位作为行值,低4位作为列值,以这些行列值作为索引从S盒中对应位置取出元素作为输出。例如,十六进制数{95}所对应的S盒的行值是9,列值是5,S盒中在此位置的值是{2A},相应的{95}被映射为{2A}。

clip_image008

clip_image010

下面是一个字节代替的例子:

0$PX88P2L$T6LT29YSANZ~R

 

2、行移位

正向和逆向变换。正向行移位,state的第一行保持不变。把state的第二行循环左移一个字节,state的第三行循环左移两个字节,state的第四行循环左移三个字节。

行移位变换的例子:

45~C`_81$YB%UO)()H%$USH

逆向行移位将state中的后三行执行相反方向的移位操作,如第二行向右循环移位一个字节,其他类似操作。

 

3、列混淆

正向和逆向变换。

列混淆变换的正向列混淆变换对每列独立地进行操作。每列中的每个字节被映射为一个新值,此值由该列中的4个字节通过函数变换得到。

列混淆例子:

M3SVEDHJ`%LE]4Z5583E2X9

计算过程:

47 = (02•87)⊕(03•6E)⊕(01•4A)⊕(01•A6)

其中:

02•87 = 02•10000111B = 00001110B⊕00011011B = 00010101B = 15

03•6E = (01⊕02)•6E = (01•6E)⊕(02•6E)

         = 01101110B⊕(11011100B) = 10110010B = B2

01•46 = 46

01•A6 = A6

15⊕B2⊕46⊕A6 = 47

注意: G(28)上的运算

加法:按位异或

乘法:可通过对多个中间结果的移位运算和异或一个特定的比特串(比如00011011)实现。(与最高位b7有关)

[874JN)~DR[P)O7[DYXPOSS

逆向列混淆变换可以再乘以矩阵的逆得到

W@A@2QH)IJ9GT1`8JY$$UZQ

 

4、轮密钥加

正向和逆向变换。

在轮密钥加中,128位的state按位与128位的轮密钥XOR。

3VLGY(@14ISB)WAH8$7MMIC

逆向轮密钥加变换是和正向轮密钥加变换一样的,因为异或操作是其本身的逆。

A⊕B⊕B = A

单轮AES输入:

clip_image021

 

5、用伪代码表示的Rijndael加密算法

Rijndael ( State, CipherKey )

{

KeyExpansion ( CipherKey, ExpandedKey );

AddRoundKey ( State, ExpandedKey );

For ( i=1; i<Rnd; i++ )

       Round ( State, ExpandedKey + Nb*i );

FinalRound ( State, ExpandedKey + Nb*Rnd );

}

 

三、密钥扩展

clip_image023

clip_image025

clip_image027

clip_image029

 

密钥扩展伪代码描述

KeyExpansion ( byte, Key[16],word w[44] )

{

word temp;

for (i = 0;i < 4; i++)

     w[i] = (key[4*i],key[4*i+1], key[4*i+2], key[4*i+3]);

for (i = 4;i < 44; i++)

{   temp = w[i - 1];

    if (i mod 4 = 0) temp = SubWord(RotWord(temp)) + Rcon[i/4];

    w[i] = w[i-4] + temp;

}

}

输入密钥直接被复制到扩展密钥数组的前四个字节。然后每次用四个字节填充扩展密钥数组余下的部分。在扩展密钥数组中,每一个新增的字w[i]的值依赖于w[i-1] w[i-4]。

 

四、等价的解密算法

 

交换逆向行移位和逆向字节代替

逆向移行[逆向字节代替(Si)] = 逆向字节代替[逆向移行 (Si)]

交换轮密钥加和逆向列混淆

逆向列混淆(Siwj) = [逆向列混淆(Si)] ⊕[逆向列混淆(wj)]

clip_image031

 

五、参考文献

[1] William Stallings著;王张宜等译. 密码编码学与网络安全——原理与实践(第五版)[M]. 北京:电子工业出版社,2012.1.

[2]密码算法详解——AES

[3]AES加密算法动画演示

DES算法是对称加密算法,可以用于对图片进行加密。以下是使用C语言实现DES算法加密图片的示例代码: ```c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <openssl/des.h> #define BLOCK_SIZE 8 // 加密图片文件 void encrypt_file(char *input_file, char *output_file, char *key) { FILE *fin, *fout; int i, j, len, remainder; unsigned char indata[BLOCK_SIZE], outdata[BLOCK_SIZE]; DES_key_schedule ks; DES_cblock key2; fin = fopen(input_file, "rb"); fout = fopen(output_file, "wb"); // 生成DES密钥 memset(key2, 0, sizeof(key2)); strncpy((char *)key2, key, sizeof(key2) - 1); DES_set_key_checked(&key2, &ks); while ((len = fread(indata, 1, BLOCK_SIZE, fin)) > 0) { // 补全数据块 remainder = BLOCK_SIZE - len; for (i = len; i < BLOCK_SIZE; i++) { indata[i] = remainder; } // 加密数据块 DES_ecb_encrypt(&indata, &outdata, &ks, DES_ENCRYPT); // 写入加密后的数据 fwrite(outdata, 1, BLOCK_SIZE, fout); } fclose(fin); fclose(fout); } int main() { char *key = "01234567"; char *input_file = "input.jpg"; char *output_file = "output.jpg"; encrypt_file(input_file, output_file, key); printf("加密完成\n"); return 0; } ``` 在上面的示例中,我们用到了OpenSSL库中的DES加密算法实现。程序读取输入文件,每次读取8个字节的数据块,对不足8个字节的数据块进行补全,然后使用DES算法对数据块进行加密,并将加密后的数据块写入输出文件中。 需要注意的是,由于DES算法加密后的数据块长度为8个字节,因此对于较大的图片文件,可能需要对数据块进行分组加密处理。此外,在实际应用中,为了提高加密强度,通常会使用更加安全的加密算法,如AES、RSA等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值