【密码学】AES算法

一、AES算法介绍:

AES(Advanced Encryption Standard)算法是一种广泛使用的对称密钥加密,由美国国家标准与技术研究院(NIST)2001年发布。
AES是一种分组密码,支持128位、192位和256位三种不同的密钥长度。AES的分组大小固定为128位,这意味着每次处理128位的数据块。AES算法的核心是轮函数,通过多轮的置换、替换和密钥异或操作来实现加密。对于不同的密钥长度,AES执行的轮数也不同:10轮用于128位密钥,12轮用于192位密钥,14轮用于256位密钥。
在这里插入图片描述

二、 AES加密流程:

在这里插入图片描述

  1. 密钥扩展(Key Expansion)
    将原始密钥扩展成多个轮密钥(Round Key)。对于AES-128,会产生11个轮密钥(包括初始轮密钥);AES-192会产生13个(包括初始轮密钥);AES-256会产生15个(包括初始轮密钥)。
    在这里插入图片描述

不是4的倍数

在这里插入图片描述

是4的倍数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 初始轮密钥加(AddRoundKey): 将明文块与第一个轮密钥进行XOR操作。3. 加密轮(Encrypting Rounds):AES加密包含多个轮次,每个轮次包括以下四个步骤: SubBytes(字节代换):对状态(State)中的每个字节应用非线性变换(使用S-box)。在这里插入图片描述
    在这里插入图片描述

    ShiftRows(行移位):对状态中的行进行循环位移。在这里插入图片描述
    在这里插入图片描述

    MixColumns(列混合):对状态中的列进行线性变换,将输入的44矩阵左乘一个给定的44矩阵。在这里插入图片描述
    在这里插入图片描述

    AddRoundKey(轮密钥加):将状态与当前轮密钥进行XOR操作。
    在这里插入图片描述

  2. 最终轮(Final Round)
    最后一个轮次只执行SubBytes、ShiftRows和AddRoundKey。
    SubBytes字节代换):使用Rijndael S-box对状态中的每个字节进行替换。
    ShiftRows(行移位):将状态矩阵的行进行循环左移。第一行不变,第二行左移一位,第三行左移两位,第四行左移三位。
    AddRoundKey(轮密钥加):将扩展后的轮密钥与当前状态进行XOR操作。

AES算法的加密流程是可逆的,因此解密过程与加密过程相似,只是轮密钥的应用顺序相反。

### 南京邮电大学密码学课程中的AES算法教学内容与实现方法 #### 教学目标 南京邮电大学的密码学课程注重理论与实践相结合,特别是在对称加密算法的学习上,AES(Advanced Encryption Standard)作为国际标准被重点讲解。学生通过学习该算法能够掌握其基本原理、安全性分析以及实际编程能力[^2]。 #### 基本概念 AES是一种分组加密算法,采用迭代结构,在每一轮中执行一系列替换和置换操作来混淆明文并保护数据的安全性。它支持三种不同的密钥长度:128位、192位和256位,分别对应于不同强度的安全保障需求。 #### 主要组成部分 - **初始轮键扩展**:基于输入的秘密密钥生成多轮子密钥。 - **字节替代层 (SubBytes)** :利用S盒完成非线性的字节变换过程。 - **移位行处理 (ShiftRows)** :增加扩散效果的一种简单排列方式。 - **列混合运算 (MixColumns)** :进一步增强状态矩阵间各列之间的相互作用关系。 - **加圆密钥 (AddRoundKey)** :将当前的状态同相应的子密钥按位异或组合起来形成新的状态向量。 #### 编程实现要点 在具体编码过程中需要注意以下几个方面: 1. 数据表示形式的选择——通常会选用十六进制字符串或者字节数组来进行存储管理; 2. S盒的设计构建及其逆元查找表制作; 3. 多次循环调用上述四个核心步骤直至达到指定轮数为止; 4. 对最终结果进行必要的填充去除工作以便恢复原始消息大小尺寸; 下面给出一段简单的Python语言版本伪代码用于演示如何实现一个基础版的AES加密逻辑: ```python from Crypto.Cipher import AES import base64 def pad(s): block_size = 16 padding_length = block_size - len(s) % block_size return s + bytes([padding_length]) * padding_length def unpad(s): last_byte = s[-1] return s[:-last_byte] def encrypt(plaintext, key): cipher = AES.new(key, AES.MODE_ECB) padded_plaintext = pad(plaintext.encode()) ciphertext_bytes = cipher.encrypt(padded_plaintext) return base64.b64encode(ciphertext_bytes).decode() def decrypt(ciphertext_b64, key): cipher = AES.new(key, AES.MODE_ECB) ciphertext_bytes = base64.b64decode(ciphertext_b64) decrypted_padded_text = cipher.decrypt(ciphertext_bytes) plaintext = unpad(decrypted_padded_text) return plaintext.decode() ``` 此段脚本仅作为一个入门级例子展示目的,并未考虑任何性能优化措施亦或是防御侧信道攻击等问题。因此,在真实项目开发当中还需要更加严谨细致地对待每一个环节细节部分。 #### 安全性和测试评估 为了验证所编写程序的有效性及可靠性,可以引入多种统计检验手段比如零一比例检测法(Zero-One Ratio Test),扑克牌分布均匀度测量(Poker Test),连续相同数值序列计数(Runs Test)等等。这些方法可以帮助我们判断产生的随机数是否具备良好的不可预测特性从而间接反映整个系统的健壮程度水平高低情况怎样样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抓跟ミgragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值