正点原子官方 发表于 2025-9-18 09:16

【正点原子K210连载】第二十七章 高级加密加速器实验《DNK210使用指南-SDK版》

第二十七章 高级加密加速器实验
本章将介绍Kendryte K210的AES模块的使用,通过AES256加密实验帮助读者了解AES相关知识。通过本章的学习,读者将会对Kendryte K210内置的硬件AES模块有初步认知和应用能力。本章分为如下几个小节:27.1 AES介绍27.2 硬件设计27.3 程序设计27.4 运行验证

27.1 AES介绍Kendryte K210内置AES(高级加密加速器),相对于软件可以极⼤的提高AES运算速度。 AES加速器支持多种加密/解密模式(ECB,CBC,GCM),多种⻓度的KEY(ECB,CBC,GCM)的运算。AES 加速器是用来加密和解密的模块,具体性能如下:1. 支持ECB,CBC,GCM三种加密方式2. 支持128位,192位,256位三种长度的KEY3. KEY可以通过软件配置,受到硬件电路保护4. 支持DMA传输Kendryte K210提供了非常多操作AES的API函数,我们这里就不一一详细讲解,大家可以自行参考官方库文件aes.c和aes.h,本章以AES256实验为例,以表格的形式讲述部分用到的函数,这些函数介绍如下:
函数名描述
aes_ecb256_hard_encryptAES-ECB-256 加密运算。输入输出数据都使用 cpu 传输。ECB 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。ECB 模式没有用到向量。
aes_ecb256_hard_decryptAES-ECB-256 解密运算。输入输出数据都使用 cpu 传输。ECB 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。ECB 模式没有用到向量。
aes_cbc256_hard_encryptAES-CBC-256 加密运算。输入输出数据都使用 cpu 传输。CBC 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。
aes_cbc256_hard_decryptAES-CBC-256 解密运算。输入输出数据都使用 cpu 传输。CBC 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。
aes_gcm256_hard_encryptAES-GCM-256 加密运算。输入输出数据都使用 cpu 传输。
aes_gcm256_hard_decryptAES-GCM-256 解密运算。输入输出数据都使用 cpu 传输。
aes_ecb256_hard_encrypt_dmaAES-ECB-256 加密运算。输入数据使用 cpu 传输,输出数据都使用 dma 传输。ECB 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。ECB 模式没有用到向量。
aes_ecb256_hard_decrypt_dmaAES-ECB-256 解密运算。输入数据使用 cpu 传输,输出数据都使用 dma 传输。ECB 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。ECB 模式没有用到向量。
aes_cbc256_hard_encrypt_dmaAES-CBC-256 加密运算。输入数据使用 cpu 传输,输出数据都使用 dma 传输。CBC 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。
aes_cbc256_hard_decrypt_dmaAES-CBC-256 解密运算。输入数据使用 cpu 传输,输出数据都使用 dma 传输。CBC 加密将明文按照固定大小 16bytes 的块进行加密的,块大小不足则进行填充。
aes_gcm256_hard_encrypt_dmaAES-GCM-256 加密运算。输入数据使用 cpu 传输,输出数据都使用 dma 传输。
aes_gcm256_hard_decrypt_dmaAES-GCM-256 解密运算。输入数据使用 cpu 传输,输出数据都使用 dma 传输。
aes_initAES 硬件模块的初始化
aes_processAES 硬件模块执行加密解密操作
gcm_get_tag获取 AES-GCM 计算结束后的 tag
表27.1.1 AES部分API函数介绍上表介绍了AES256操作所用到的所有API函数。27.2 硬件设计27.2.1 例程功能1. 计算并打印输出AES的ECB模式、CBC模式和 GCM 模式对数据加密处理的时间(包括软件和硬件的对比时间,CPU 和 DMA 使用的是硬件的 AES )。27.2.2 硬件资源1.USB接口 UARTHS_TX – IO5 UARTHS_RX – IO4 27.2.3 原理图本章实验内容,主要讲解AES模块的使用,无需关注原理图。27.3 程序设计27.3.1 main.c代码本章例程均来自官方SDK的DEMO,本章仅简单介绍下maic.c文件部分函数的功能,代码如下所示:int main(void){    aes_cipher_mode_t cipher;    printf("begin test %d\n", get_time_flag);     for (cipher = AES_ECB; cipher < AES_CIPHER_MAX; cipher++)    {      printf("[%s] test all byte ... \n", cipher_name);      if (AES_CHECK_FAIL == aes_check_all_byte(cipher))      {            printf("aes %s check_all_byte fail\n", cipher_name);            return -1;      }       printf("[%s] test all key ... \n", cipher_name);      if (AES_CHECK_FAIL == aes_check_all_key(cipher))      {            printf("aes %s check_all_key fail\n", cipher_name);            return -1;      }       printf("[%s] test all iv ... \n", cipher_name);      if (AES_CHECK_FAIL == aes_check_all_iv(cipher))      {            printf("aes %s check_all_iv fail\n", cipher_name);            return -1;      }            printf("[%s] [%ld bytes] cpu time = %ld us, dma time = %ld us, soft time = %ld us\n", cipher_name,                AES_TEST_DATA_LEN,                cycle/(sysctl_clock_get_freq(SYSCTL_CLOCK_CPU)/1000000),                cycle/(sysctl_clock_get_freq(SYSCTL_CLOCK_CPU)/1000000),                cycle/(sysctl_clock_get_freq(SYSCTL_CLOCK_CPU)/1000000));    }    printf("aes-256 test pass\n");    while (1)      ;    return 0;}可以看到,mian函数主要的功能是通过一个for循环,把 AES 的三种模式(ECB/CBC/GCM)对应的时间打印出来。check_result_t aes_check_all_byte(aes_cipher_mode_t cipher){    uint32_t check_tag = 0;    uint32_t index = 0;    size_t data_len = 0;    memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);    if (cipher == AES_GCM)      iv_len = iv_gcm_len;    for (index = 0; index < (AES_TEST_DATA_LEN < 256 ? AES_TEST_DATA_LEN : 256); index++)    {      aes_hard_in_data = index;      data_len++;       AES_DBG("[%s] test num: %ld \n", cipher_name, data_len);      if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)            == AES_CHECK_FAIL)            check_tag = 1;    }     memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);    get_time_flag = 1;    data_len = AES_TEST_DATA_LEN;    AES_DBG("[%s] test num: %ld \n", cipher_name, data_len);    for (index = 0; index < data_len; index++)      aes_hard_in_data = index % 256;    if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)      == AES_CHECK_FAIL)      check_tag = 1;    get_time_flag = 0;    if(check_tag)      return AES_CHECK_FAIL;    else      return AES_CHECK_PASS;}AES检测所有byte。check_result_t aes_check_all_key(aes_cipher_mode_t cipher){    size_t data_len = 0;    uint32_t index = 0;    uint32_t i = 0;    uint32_t check_tag = 0;     memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);    if (cipher == AES_GCM)      iv_len = iv_gcm_len;    data_len = AES_TEST_DATA_LEN;    for (index = 0; index < data_len; index++)      aes_hard_in_data = index;    for (i = 0; i < (256 / key_len); i++)    {      for (index = i * key_len; index < (i * key_len) + key_len; index++)            aes_key = index;      if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)            == AES_CHECK_FAIL)            check_tag = 1;    }    if(check_tag)      return AES_CHECK_FAIL;    else      return AES_CHECK_PASS;}AES检测所有key。check_result_t aes_check_all_iv(aes_cipher_mode_t cipher){    size_t data_len = 0;    uint32_t index = 0;    uint32_t i = 0;    uint8_t check_tag = 0;     memset(aes_hard_in_data, 0, AES_TEST_PADDING_LEN);    if (cipher == AES_GCM)      iv_len = iv_gcm_len;    data_len = AES_TEST_DATA_LEN;    for (index = 0; index < data_len; index++)      aes_hard_in_data = index;    for (i = 0; i < (256 / iv_len); i++)    {      for (index = i * iv_len; index < (i * iv_len) + iv_len; index++)            aes_iv = index;      if (aes_check(aes_key, key_len, aes_iv, iv_len, aes_aad, aad_len, cipher, aes_hard_in_data, data_len)            == AES_CHECK_FAIL)            check_tag = 1;    }    if(check_tag)      return AES_CHECK_FAIL;    else      return AES_CHECK_PASS;}AES检测所有IV。27.4 运行验证将DNK210开发板连接到电脑主机,通过VSCode将固件烧录到开发板中,我们打开“串口终端”,可以看到串口中断不断的打印数据,如下图所示: 图27.4.1 “串行终端”窗口打印输出

yangjiaxu 发表于 2025-9-28 10:11

原来AES叫高级加密加速器啊?我以为就是一种加密算法呢
页: [1]
查看完整版本: 【正点原子K210连载】第二十七章 高级加密加速器实验《DNK210使用指南-SDK版》