AES CCM 算法的 FPGA/Verilog 实现
主要功能
- AES 加密、解密、密钥扩展算法的 Verilog 实现
- AES-CCM 128 位算法的 Verilog 实现
- AES-CCM 的嵌入式 C 语言参考代码
- AES-CCM 算法的测试向量
- AES-CCM 算法自动化仿真测试环境(Modelsim & Makefile)
核心模块实现
1. AES 加密、解密与密钥扩展
AES 加密和解密基于复杂的轮变换操作。以下是密钥扩展的 Verilog 代码片段:
module key_expansion ( input wire [127:0] key, output reg [127:0] w[0:10] );
always @(*) begin
w[0] = key;
for (int i = 1; i < 11; i = i + 1) begin
if (i % 4 == 0) begin
// 轮常量异或等操作
w[i] = w[i - 1] ^ {w[i - 4][111:0], w[i - 4][127:112]} ^ {8'h01 << (i / 4 - 1), 56'h0};
end else begin
w[i] = w[i - 1] ^ w[i - 4];
end
end
end
endmodule
通过不断对输入密钥进行异或等操作,生成不同轮次所需的子密钥。每一轮的子密钥生成逻辑紧密关联,是 AES 加密解密过程的关键基础。
2. AES-CCM 128 位算法实现
AES-CCM 在传统 AES 基础上增加了认证功能。以认证码计算部分为例:
module ccm_auth ( input wire [127:0] block, input wire [127:0] key, output reg [127:0] auth_tag );
reg [127:0] state;
// 初始化状态
always @(*) begin
state = block;
for (int i = 0; i < 10; i = i + 1) begin
// 与子密钥异或
state = state ^ key;
// 执行 AES 轮变换操作(类似加密轮操作)
// 这里省略具体轮变换代码实现
end
auth_tag = state;
end
endmodule
此模块通过对数据块和密钥进行多次操作,生成认证标签,确保数据在传输过程中的完整性。
3. 嵌入式 C 语言参考代码
虽然主要讲 FPGA/Verilog,但嵌入式 C 语言代码也是很好的参考。下面是简单的加密函数片段:
void aes_ccm_encrypt(unsigned char *plaintext, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) {
// 初始化相关参数
// 调用 AES 加密函数对明文进行加密
aes_encrypt(plaintext, key, ciphertext);
// 进行 CCM 模式相关的额外操作,如计算认证码等
// 这里省略具体代码
}
这段 C 代码展示了如何调用 AES 加密函数,并结合 CCM 模式的特点来对明文进行加密处理。
4. 测试向量
测试向量是验证算法正确性的关键。从 NIST 提供的测试向量中,我们可以获取一系列已知的明文、密钥、密文组合。例如文件格式如下:


