分组密码——AES

高级数据加密标准(AES)

诞生

1994年,美国颁布了密钥托管加密标准EES,计划用EES取代DES。EES的密码算法被设计成允许法律监听的保密通信方式,即如果法律部门不监听,则加密对于其他人来说是计算上不可破译的,但是经法律部门的允许可以解密进行监听。
1995年,美国贝尔实验室的年轻博士M.Blaze攻击EES的法律监督字段,伪造ID成功。
1997年开始公开征集新的数据加密标准算法AES。
2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen和Vincent Rijimen提出的一种密码算法RIJNDAEL作为美国国家标准。
RIJNDAEL(下文称AES)算法之所以能被选为AES是因为其安全、性能好、效率高、实用、灵活。

AES的设计要求

安全性:可抵抗现有的所有攻击
实用性:应用于各种应用环境,加密解密速度快
扩散性:可扩展性

数学基础

RIJNDAEL算法中的许多运算是按字节和4字节的字来定义的。把看成是在有限域GF(28)上的一个元素,把一个4字节的字看成是系数取自GF(28),并且次数小于4次的多项式。
有限域GF(28)上的元素有几种表示方法,出于效率的考虑,AES算法采用多项式表示法。
在这里插入图片描述
例如,设字节B=10011011,则对应的多项式为:x7+x4+x3+x+1 。
在这里插入图片描述在这里插入图片描述

  • 定义 3-8 GF(28)上的多项式a(x)=a3x3+a2x2+a1x1+a0和b(x)=b3x3+b2x2+b1x1+b0相乘模x4+1的积(表示为c(x)=a(x)*b(x))为c(x)=c3x3+c2x2+c1x1+c0,其系数由下面四个式子得到:
    在这里插入图片描述

AES加密算法

AES算法是一个数据块长度和密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于256位的32位的任意倍数。美国颁布AES时规定数据块长度为128位,密钥的长度可分别选择为128位,192位或256位。

AES算法结构如下图所示
在这里插入图片描述
AES算法采用分组密码的一种通用结构——对轮函数实施迭代的结构。但是采用代替/置换网络结构(SP结构),没有DES的Feistel结构。

轮函数由一下三层组成:

1.非线性层:进行非线性S盒变换ByteSub,由16个S盒并置而成,起混淆作用。
2.线性混合层:行移位和列混合,以确保多轮之上的高度扩散。
3.密钥加密层:进行轮密钥加密

1. 状态

加解密要经过多次数据变换操作,每一次操作产生一个中间结果,称其为状态。
把状态表示为二维字节数组,四行Nb列,Nb等于数据块长度除以32。

2. 轮函数

AES加密轮函数采用SP结构,由S盒变换ByteSub、行移位变换ShiftRow、列混合变换MixColumn、轮密钥加密AddRoundKey组成。用伪C语言表示如下:

Round(State,RoundKey)
{
	ByteSub(State);
	ShiftRo(State);
	MixColumn(State);
	AddRoundKey(State,RoundKey);
}

加密算法最后一轮的轮函数与上面的标准轮函数有所不同,去掉了行混合变换。

FinalRound(State,RoundKey)
{
	ByteSub(State);
	ShiftRo(State);
	AddRoundKey(State,RoundKey);
}
(1)S盒变换ByteSub

ByteSub变换是按字节进行的,作用在状态中每个字节上的一种非线性字节变换。这个变换按两步进行:
1)把字节的值用它的乘法逆(定义3-4)来代替,其中“00”的逆就是它自己
2)经1)处理后的字节再进行如下的仿射变换:

在这里插入图片描述
值得注意的是:

1.把字节的值用乘法逆的值来代替,是一种非线性变换。
2.S盒变换为加密算法提供非线性,是决定密码安全性的关键。
3.8进8出。
4.S盒变换是可逆的,但不是自逆的。

(2)行移位变换ShiftRow

对状态的行进行循环移位变换。第0行不移位,第1行循环左移C1字节,第二行循环左移C2字节,第三行循环左移C3字节。
移位值C1,C2,C3与Nb有关,具体见下表:

NbC1C2C3
4123
6123
8134
(3)列混合变换MixColumn

对状态的列进行混合变换。把每一列看成是GF(28)上的多项式,并与一个固定的多项式c(x)相乘后模多项式x4+1,其中c(x)为:
c(x) = '03’x3 + '01’x2 + '01‘x + ‘02’ 。

(4)轮密钥加密AddRoundKey

利用轮密钥对状态进行模2相加的变换。轮密钥根据轮密钥产生算法通过主密钥扩展和选择得到。

轮密钥产生算法

轮密钥产生算法分为两步进行:密钥扩展和轮密钥选择
原则如下:

  1. 轮密钥的比特总数为数据块长度与轮数加1的积。例如,对于128位的分组长度和10轮迭代,轮密钥总长度为128x(10+1)=1408位。
  2. 首先将用户的密钥扩展为一个扩展密钥。
  3. 再从扩展密钥中选出轮密钥:第一个轮密钥有扩展密钥中的前Nb个字组成,第二个由接下来的Nb个字组成,以此类推。

轮密钥选择
在这里插入图片描述

加密算法

组成:

  1. 一个初始轮密钥加
  2. Nr-1轮的标准轮函数
  3. 最后一轮的非标准轮函数

用伪代码表示:

Rijindael(State,CipherKey)
{
	KeyExpansion(CipherKey,RoundKey)
	AddRoundKey(State,ExpandedKey)
	For(I=1;I<Nr;I++)
	{
		Round(State,ExpandedKey+Nb*I)
		{
			ByteSub(State);
			ShiftRo(State);
			MixColumn(State);
			AddRoundKey(State,ExpandedKey+Nb*I);
		}
	}
	FinalRound(State,ExpandedKey+Nb*Nr)
	{
		ByteSub(State);
		ShiftRo(State);
		AddRoundKey(State,ExpandedKey+Nb*Nr);
	}
}

解密算法

AES算法不是对合运算,解密和加密算法不同。根据解密算法是加密算法的逆,直接把加密算法倒序执行就得到解密算法,但是不便于工程实现。
由于AES算法设计巧妙,我们可以稍微改变密钥扩展策略,便可以得到等价的解密算法,等价的解密算法与加密算法结构相同,从而方便了工程实现。
等价解密算法中的变换为加密算法中相应变换的逆变换。

伪代码如下

Inv_Rijindael(State,CipherKey)
{
	Inv_KeyExpansion(CipherKey,Inv_ExpandedKey)
	AddRoundKey(State,Inv_ExpandedKey+Nb*Nr)
	For(I=Nr-1;I>0;I--)
	{
		Inv_Round(State,Inv_ExpandedKey+Nb*I)
		{
			Inv_ByteSub(State);
			Inv_ShiftRo(State);
			Inv_MixColumn(State);
			AddRoundKey(State,Inv_ExpandedKey+Nb*I);
		}
	}
	Inv_FinalRound(State,Inv_ExpandedKey)
	{
		Inv_ByteSub(State);
		Inv_ShiftRo(State);
		AddRoundKey(State,Inv_ExpandedKey);
	}
}

AES的安全性

AES算法的安全设计策略是宽轨迹策略。宽轨迹策略是针对差分攻击和线性攻击提出来的,它的最大优点是可以给出算法的最佳差分特征的概率以及最佳线性逼近的偏差界,由此可以分析算法抗差分攻击和线性攻击的能力。
(1)抗攻击能力
抗差分攻击和线性攻击能力较好。缺点是列混合扩散度不够,密钥扩展的非线性不够,缺少抗侧信道攻击的设计。
(2)弱密钥
不存在像DES中出现的那种弱密钥和半弱密钥,对密钥的选择没有任何限制。
(3)适应性
AES数据块的长度和密钥长度都可变,能够适应不同的安全应用环境。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AES(Advanced Encryption Standard)是一种常用的分组密码算法,它支持128、192和256位的密钥长度。AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,并且已经被广泛应用在各个领域中。 在进行AES加密操作前,首先需要确定密钥的长度,并通过密钥扩展算法生成相关的轮密钥。轮密钥是通过对原始密钥进行一系列运算,产生多个轮次的中间结果得到的。 在加密操作中,AES算法将明文分为多个长度为128位(16字节)的数据块,并通过多轮的混淆和替代操作,将每个数据块转换为密文数据块。这其中包括4个阶段的处理:字节代换、行移位、列混淆和轮密钥加。 在解密操作中,AES算法将密文数据块通过逆向处理,逐步还原为明文数据块。解密过程包括4个阶段的处理:逆字节代换、逆行移位、逆列混淆和逆轮密钥加。 AES算法的加密解密操作是可逆的,即通过正确的密钥和操作步骤,可以将密文还原为明文或者将明文转换为密文。 总之,AES算法是一种高效且安全的分组密码算法,它通过多次迭代的混淆和替代操作,对输入数据进行加密操作。通过正确的密钥和步骤,可以将密文还原为明文,或者将明文转换为密文。这种算法被广泛应用于数据加密和保护隐私信息的场景中。 ### 回答2: AES(高级加密标准)是一种分组密码算法,用于加密和解密操作。它是一种对称密钥算法,意味着使用相同的密钥进行加密和解密。 AES算法使用一个称为"轮"的重复过程,通过多次迭代的代换和置换操作来加密和解密数据。它支持三个不同的密钥长度:128位、192位和256位。 在使用AES算法进行加密时,明文被分成相同长度的块,每个块都会经过一系列的替代、置换、混淆等操作。然后,使用加密密钥对每个块进行处理,这个密钥必须是与解密操作使用的密钥相同。最后得到密文。 在解密操作中,使用相同的密钥对密文进行处理,逆转替代、置换、混淆等操作,然后得到原始的明文。 C语言可以用来实现AES加密解密操作。通常,需要引入一个密码库,如OpenSSL,以便使用其中的AES函数库。可以通过定义并初始化密钥、明文、密文等变量,然后使用AES加密函数来进行加密,使用AES解密函数来进行解密。 需要注意的是,在使用AES加密解密操作时,密钥的安全性至关重要。密钥必须安全保存,以防止被未经授权的人访问。 总之,AES是一种分组密码算法,用于加密和解密操作。通过使用C语言中的密码库,可以实现AES加密解密操作。但在使用时,需注意密钥的安全性。 ### 回答3: AES(Advanced Encryption Standard)是一种常见的对称分组密码算法,被广泛应用于数据加密和保护的领域中。 AES加密解密操作C使用C语言编写,通过调用相应的AES算法库来实现加密和解密的过程。下面将以C语言为例,使用AES算法库进行AES加密和解密的操作。 首先,需要在C语言代码中引入相关的AES库文件,声明相应的函数和变量。然后创建密钥和待加密的明文数据,并设置相应的加密模式和填充模式。接下来,使用AES算法库提供的函数,将明文数据与密钥进行加密操作。最后将得到的密文数据进行输出。 示例代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/aes.h> void encryptAES(char *key, char *plainText, unsigned char *ciphertext){ AES_KEY aesKey; if (AES_set_encrypt_key((unsigned char *)key, 128, &aesKey) < 0) { fprintf(stderr, "Unable to set encryption key in AES\n"); exit(1); } AES_encrypt((unsigned char *)plainText, ciphertext, &aesKey); } void decryptAES(char *key, unsigned char *ciphertext, char *deciphertext){ AES_KEY aesKey; if (AES_set_decrypt_key((unsigned char *)key, 128, &aesKey) < 0) { fprintf(stderr, "Unable to set decryption key in AES\n"); exit(1); } AES_decrypt(ciphertext, (unsigned char *)deciphertext, &aesKey); } int main(){ char key[] = "0123456789abcdef"; char plainText[] = "Hello,AES!"; unsigned char ciphertext[AES_BLOCK_SIZE]; char deciphertext[AES_BLOCK_SIZE]; encryptAES(key, plainText, ciphertext); printf("Ciphertext: "); for(int i=0; i<AES_BLOCK_SIZE; i++){ printf("%02x", ciphertext[i]); } printf("\n"); decryptAES(key, ciphertext, deciphertext); printf("Deciphertext: %s\n", deciphertext); return 0; } ``` 以上示例代码实现了AES加密和解密的操作,并输出了加密后的密文和解密后的明文。其中使用的密钥为"0123456789abcdef",待加密的明文为"Hello,AES!"。 这就是一个简单的使用C语言进行AES加密解密操作的实例。当然,在实际应用中,我们还需要考虑更多的安全性和实用性考量,例如密钥的生成与管理、数据分块处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值