KF32146/156学习笔记(二) CAN&CANFD模块
AES

目录

简介

  • AES-128是一种对称加密算法,其中“128”表示密钥长度为128位(16字节)。AES-128是高级加密标准(Advanced Encryption Standard, AES)的一个变体,其他变体包括AES-192和AES-256,分别使用192位和256位的密钥。
  • KF32146/156芯片内部集成了一个AES 加密模块,其可以进行128bit (256bit也适用)的AES 加密解密,生成用于流密码加密的密钥(支持ECB和CBC模式)

使用方法

配置好如下参数之后,即可使用AES加密解密功能(详细内容请参考SDK的例程)。

/* 秘钥 */
uint32_t AesKey[4] = {0x2b7e1516, 0x28aed2a6, 0xabf71588, 0x09cf4f3c};

/* 加密时明文 */
uint32_t AesPlain[4] = {0x6bc1bee2, 0x2e409f96, 0xe93d7e11, 0x7393172a};

/* 解密时密文  */
uint32_t AesPlain_de[4] = {0xA1EE5608, 0xB33AF054, 0x70858608, 0xD1DE080F};

/* 密文 */
uint32_t AesCipher[4] = {0x3ad77bb4, 0x0d7a3660, 0xa89ecaf3, 0x2466ef97};

#define AES_KEY_128BITS (0x3U)
#define AES_KEY_256BITS (0x7U)

/* AES 加密初始化参数 */
Aes_Config_t AesInit_Encrypt = {
    .ClkSrc = AES_TRNG_SCK_HFCLK,           /* AES 时钟源选择 */
    .ClkDiv = AES_SCK_DIV0,                 /* AES 时钟分频 */
    .Algorithm = AES_STANDARD_ALGORITHM,    /* 选择标准算法或者自定义算法*/
    .AesMode = AES_WORK_ECB_MODE,           /* 选择工作模式 */
    .EnOrDecrytion = AES_ENCRYPT,           /* 选择加密或者解密 */
    .KeyLen = AES_KEY_128BITS,              /* 选择密钥长度 */
    .ExtensionNum = 0U,                     /* 选择扩展轮数,仅自定义算法时有效 */
    .SBoxInv = AES_SBOX_NOR_REPLACE,        /* 选择是否使用反SBox替换 */
    .Key = AesKey,
};

/* AES 解密初始化参数 */
Aes_Config_t AesInit_Encrypt = {
    .ClkSrc = AES_TRNG_SCK_HFCLK,           /* AES 时钟源选择 */
    .ClkDiv = AES_SCK_DIV0,                 /* AES 时钟分频 */
    .Algorithm = AES_STANDARD_ALGORITHM,    /* 选择标准算法或者自定义算法*/
    .AesMode = AES_WORK_ECB_MODE,           /* 选择工作模式 */
    .EnOrDecrytion = AES_DECRYPT,           /* 选择加密或者解密 */
    .KeyLen = AES_KEY_128BITS,              /* 选择密钥长度 */
    .ExtensionNum = 0U,                     /* 选择扩展轮数,仅自定义算法时有效 */
    .SBoxInv = AES_SBOX_NOR_REPLACE,        /* 选择是否使用反SBox替换 */
    .Key = AesKey,
};

详细解析

可以直接参考以下内容,按照如下操作使用:

  • 有一个宏定义用于定义字节序,这里我们定义为1:
    byte_order
  • 然后使用起来就很简单了,比如你的秘钥为0123456789ABCDEF0123456789ABCDEF,明文为0123456789ABCDEF0123456789ABCDEF,那么对应的秘钥和明文以及得到的密文如下图所示:
IndexAesKeyAesPlainAesCipher
00x012345670x012345670xA1EE5608
10x89ABCDEF0x89ABCDEF0xB33AF054
20x012345670x012345670x70858608
30x89ABCDEF0x89ABCDEF0xD1DE080F

验证

加密验证

  • 此处为寄存器实际值,实际输出结果的AesCipher数组已经处理过了顺序
    encrypt_demo

  • 利用在线网站计算的结果:
    encrypt_check

解密验证

  • 此处为寄存器实际值,实际输出结果的AesCipher数组已经处理过了顺序
    decrypt_demo

  • 利用在线网站计算的结果:
    decrypt_check