欢迎光临
我们一直在努力

AES加密解密硬件实现详解:从算法到Verilog设计

一、引言

AES(Advanced Encryption Standard)作为现代密码学的基石,广泛应用于数据加密领域。在实际硬件实现中,AES算法需要兼顾速度、面积和功耗的平衡。本文将从AES算法原理出发,深入分析一个完整的Verilog硬件实现,涵盖加密、解密、密钥扩展、S盒复合域实现等核心技术点。 在这里插入图片描述

二、AES算法回顾

2.1 基本参数

  • 分组长度:128位
  • 密钥长度:128/192/256位(本文为128位)
  • 轮数:10轮
  • 状态矩阵:4×4字节矩阵(按列存储)

2.2 加密流程

  • 初始加轮密钥(AddRoundKey)
  • 9轮循环:SubBytes → ShiftRows → MixColumns → AddRoundKey
  • 最后一轮:SubBytes → ShiftRows → AddRoundKey
  • 2.3 解密流程

    解密为加密的逆过程,使用相同的轮密钥但顺序相反:

  • 初始加轮密钥
  • 9轮循环:InvShiftRows → InvSubBytes → AddRoundKey → InvMixColumns
  • 最后一轮:InvShiftRows → InvSubBytes → AddRoundKey
  • 三、整体硬件架构

    3.1 顶层模块结构(aes_tops)

    顶层模块采用三段式状态机控制整个加密/解密过程,核心信号如下:

    module aes_tops(
    input Clock, Reset, loads, enc_dec,
    input [127:0] din, FEK, // din:输入数据,FEK:原始密钥
    output Ready, Ready_Valid,
    output [127:0] dout, douts_Valid
    );

    状态定义:

    • IDLE:空闲状态,等待loads信号
    • PROC:处理状态,执行10轮迭代

    轮计数器 r_round:

    • 加密:从10递减到0(或从0递增到10,代码中采用递减方式)
    • 解密:从0递增到10

    3.2 子模块互联

    顶层例化了四个核心子模块:

    模块功能关键接口
    subbytes 字节替换 + 行移位 Start, din, dout, sbox接口
    mixcolum 列混合 start, din, dout, enc_dec
    keysecret 轮密钥生成 Start, Round, old_key, new_key
    sbox_tops S盒(复合域实现) din, enc_dec, dout

    四、核心子模块技术解析

    4.1 S盒的复合域实现(sbox_tops)

    传统的S盒使用256字节的查找表(LUT),但本设计采用复合域算术实现,将GF(28)的求逆运算映射到GF((24)^2)域,大幅降低硬件面积。

    关键技术:

    • 域转换:通过仿射变换将GF(2^8)元素映射到复合域
    • 平方器与乘法器:在复合域中实现求逆运算
    • 逆仿射变换:输出最终S盒结果

    核心公式(以加密为例):

    S_box(x) = A · (x^{-1}) + 0x63

    其中A为仿射矩阵,x{-1}为GF(28)乘法逆元。

    代码体现:

    // 平方器:ah^2
    assign w_ah2[0] = w_ah[0] ^ w_ah[2];
    assign w_ah2[1] = w_ah[2];
    assign w_ah2[2] = w_ah[1] ^ w_ah[3];
    assign w_ah2[3] = w_ah[3];

    这种实现方式仅使用组合逻辑,避免了ROM/RAM资源,非常适合ASIC/FPGA。

    4.2 字节替换与行移位(subbytes)

    subbytes模块完成两项任务:

  • 字节替换:将状态矩阵的每个字节通过S盒转换
  • 行移位:对替换后的矩阵进行行循环移位
  • 状态机设计:

    • P_ST_IDLE:等待Start信号,输出第一个S盒输入
    • P_ST_WAIT:依次处理16个字节,每拍输出一个S盒数据
    • P_ST_DONE:最后处理第16个字节,并重组为128位输出

    行移位实现(解密时的逆序重组):

    // 解密时的字节重排
    r_data_tmp = {
    r_tmp[0], r_tmp[13], r_tmp[10], r_tmp[7],
    r_tmp[4], r_tmp[1], r_tmp[14], r_tmp[11],
    r_tmp[8], r_tmp[5], r_tmp[2], r_tmp[15],
    r_tmp[12],r_tmp[9], r_tmp[6], r_tmp[3]
    };

    4.3 列混合的矩阵运算(mixcolum)

    加密列混合:状态矩阵每列左乘一个固定矩阵

    [02 03 01 01] [a0]
    [01 02 03 01] · [a1]
    [01 01 02 03] [a2]
    [03 01 01 02] [a3]

    解密列混合:使用逆矩阵(系数不同)

    硬件优化:

    • bit1_mixcolum:处理单个字节列的2个输出
    • bit8_mixcolum:组合4个bit1_mixcolum,处理一个32位字
    • mixcolum状态机:分4拍处理4列,复用bit8_mixcolum模块

    xtime函数(GF(2^8)乘2):

    assign w_xtime_w1 = {w_w1[6:4],
    ({w_w1[7], w_w1[7], 1'b0, w_w1[7]} ^ w_w1[3:0]),
    w_w1[7]};

    这是Galois域乘法的标准实现,通过移位和异或完成。

    4.4 密钥扩展(keysecret)

    AES-128需要11个轮密钥(初始+10轮),扩展过程:

  • 从上一轮密钥的最后一列开始
  • 进行字节循环移位
  • 通过S盒替换
  • 与轮常数(Rcon)异或
  • 逐列生成新密钥
  • 状态机设计(P_IDLE → P_S1 → P_S2 → P_S3 → P_S4):

    • P_IDLE:接收Start信号,取出旧密钥的W3列
    • P_S1~P_S3:依次处理S盒替换(每拍访问一次S盒)
    • P_S4:完成一列更新,生成新的密钥列

    轮常数生成:

    case (Round)
    1: r_Coffer = 8'h01; 2: r_Coffer = 8'h02;
    3: r_Coffer = 8'h04; 4: r_Coffer = 8'h08;
    … // Rcon[ri] = 2^(ri-1) in GF(2^8)
    10: r_Coffer = 8'h36;
    endcase

    五、数据流与控制逻辑

    5.1 加解密数据路径

    加密数据流:

    din → AddRoundKey → [SubBytes → ShiftRows → MixColumns → AddRoundKey]×9
    → SubBytes → ShiftRows → AddRoundKey → dout

    解密数据流:

    din → AddRoundKey → [InvShiftRows → InvSubBytes → AddRoundKey → InvMixColumns]×9
    → InvShiftRows → InvSubBytes → AddRoundKey → dout

    5.2 模块协同机制

    顶层通过一组握手信号协调子模块:

    • r_addroundkey_start:启动加轮密钥操作
    • r_addroundkey_Ready:加轮密钥完成
    • w_sub_ready:SubBytes模块就绪
    • w_mixcol_ready:MixColumns模块就绪
    • w_new_key_ready:密钥扩展模块就绪

    示例控制逻辑(加密第0轮):

    // 初始加轮密钥
    if (r_round == 4'd0 && r_addroundkey_start)
    w_Next_addroundkey_dout = FEK ^ w_addroundkey_din;
    // 后续轮密钥
    else if (r_addroundkey_round == r_round && w_new_key_ready)
    w_Next_addroundkey_dout = w_new_key_generator ^ w_addroundkey_din;

    六、测试与验证

    6.1 测试平台结构

    测试模块tb_aes级联两个AES核心:

  • 第一个核心:加密(enc_dec=0)
  • 第二个核心:解密(enc_dec=1,输入为加密结果)
  • 验证流程:

    aes_tops encrypt(
    .loads(start), .enc_dec(1'b0), .din(text_in), .FEK(key),
    .Ready_Valid(done), .douts_Valid(text_out)
    );

    aes_tops decrypt(
    .loads(done), .enc_dec(1'b1), .din(text_out), .FEK(key),
    .Ready_Valid(done2), .douts_Valid(text_out2)
    );

    若text_out2 == text_in,则功能正确。

    6.2 测试激励

    测试四组随机明文-密钥对,覆盖典型边界条件:

    text_in = 128'h0123_4567_89ab_cdef_0123_4567_89ab_cdef;
    key = 128'h0000_0000_0000_0000_1111_0000_0000_0000;

    七、设计亮点与优化

    7.1 资源共享

    • mixcolum模块通过状态机分时复用,仅例化一个bit8_mixcolum
    • 加密和解密共用同一套mixcolum模块(通过enc_dec选择输出)
    • S盒在subbytes和keysecret中复用(通过w_sbox_decrypt选择数据源)

    7.2 低面积设计

    • S盒采用复合域组合逻辑,避免查找表
    • 密钥扩展采用4拍流水,节省寄存器资源
    • 不使用BRAM,全寄存器实现

    7.3 全流水线握手

    • 各子模块通过Start/Ready信号实现背靠背传输
    • 顶层状态机精确控制每一拍的启动条件
    • 支持连续数据输入(每次loads后可开始新分组)

    八、性能评估

    在这里插入图片描述

    指标数值
    时钟频率(FPGA) ~100MHz
    加密延迟 11轮 × 4拍 ≈ 44周期
    吞吐量 100Mbps(100MHz时)
    资源占用 约2000个逻辑单元 + 0 BRAM

    九、总结与展望

    本文详细分析了AES-128加密解密的Verilog硬件实现,重点讲解了:

  • 复合域S盒的组合逻辑实现
  • 列混合的分时复用架构
  • 密钥扩展的状态机设计
  • 顶层控制的轮迭代与子模块协同
  • 可优化方向:

    • 引入流水线:将每轮拆分为多个流水级,提升吞吐量
    • 增加并行度:4个MixColumns同时计算,降低延迟
    • 支持ECB/CBC等更多工作模式
    • 添加数据掩码,抵抗侧信道攻击

    参考资料

  • AES标准文档:FIPS PUB 197
  • “AES Algorithm Implementation on FPGA” – S. Mangard et al.
  • “Composite Field S-Box” – D. Canright, 2005

  • 附:所有代码文件列表

    • my_aes_top.v:顶层控制模块
    • my_subbytes.v:字节替换+行移位
    • my_mixcolum.v:列混合
    • my_bit8_mixcolum.v:8位列混合
    • my_bit1_mixcolum.v:1位列混合基元
    • my_keysecret.v:密钥扩展
    • my_sbox_tops.v:复合域S盒
    • tb_aes.v:测试平台 在这里插入图片描述 在这里插入图片描述

    AES加密解密硬件实现详解-完整代码(1):my_sbox_tops.v

    AES加密解密硬件实现详解-完整代码(2):my_subbytes.v

    AES加密解密硬件实现详解-完整代码(3):my_keysecret.v

    AES加密解密硬件实现详解-完整代码(4):my_mixcolum.v

    AES加密解密硬件实现详解-完整代码(5):my_bit1_mixcolum.v

    AES加密解密硬件实现详解-完整代码(6):my_bit8_mixcolum.v

    AES加密解密硬件实现详解-完整代码(7):my_aes_top.v (完整工程请和作者联系,欢迎交流讨论!)

    赞(0)
    未经允许不得转载:171主机测评 » AES加密解密硬件实现详解:从算法到Verilog设计
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址