type
status
date
slug
summary
tags
category
icon
password
Property
Mar 17, 2025 09:44 AM
什么是AES加密
高级加密标准(Advanced Encryption Standard)是一种对称分组密码,是 DES 的替代方案。来自全球的密码学家提出了多种算法,最终在 2000 年选择了 Rijndael 算法。因此,我们将来探讨一下这种 Rijndael 算法的实现。
Rijndael算法
Rijndael 是一种分组加密算法。分组加密算法是一种一次处理固定数量比特的加密方法。每次处理的比特数(称为分组长度)取决于具体算法,对于 AES 来说为128 比特(16 字节)。大多数需要加密的明文都超出这个分组长度,因此我们通常会多次应用这种分组加密算法。
Go语言的实现
Go 语言官方提供了crypto/aes包,该包在构建 amd64 版本时利用 Go 汇编调用 Intel 的硬件 AES 支持,否则则采用纯 Go 实现。让我们看一下相对易于人理解的纯 Go 实现。
如上代码包括2个要点
- 块大小16字节
dst
和src
在任一索引处共享内存

![转换是基于一个名为 S-box 的包含 256 个值的转换表,每次转换 1 字节完成的。下面展示如何正确执行 sbox[s0[1]]。](https://www.notion.so/image/attachment%3A59989239-aad5-47a4-867a-2c59e32116f8%3Aaes-sbox.jpg?table=block&id=1b9e2d07-1fff-8099-8b3c-e51fd0d1703f&t=1b9e2d07-1fff-8099-8b3c-e51fd0d1703f)


![最后,它将 MixColumns 的输出与轮密钥进行异或操作。下图展示了s0[1] ^ xk[4]的执行过程(其中^在 Go 中表示异或操作)](https://www.notion.so/image/attachment%3A992333a8-78e5-460c-b4c5-7d1500844cb4%3Aaes-add-round-key.jpg?table=block&id=1b9e2d07-1fff-804a-88d4-da74abb5da4e&t=1b9e2d07-1fff-804a-88d4-da74abb5da4e)