AES#
K210 有一个硬件 AES 加密模块, 支持 ECB
、 CBC
、 GCM
模式
begin#
描述#
初始化
语法#
1
static int begin(aes_cipher_mode_t mode, aes_kmode_t keyLen);
2
static int begin(aes_cipher_mode_t mode, aes_kmode_t keyLen, aes_iv_len_t ivLen);
参数#
mode
AES_ECB ECB模式
AES_CBC CBC模式
AES_GCM GCM模式
keyLen
AES_128 Key 长度128Bit
AES_192 Key 长度192Bit
AES_256 Key 长度256Bit
ivLen
CBC模式时, 需要设置为 IV_LEN_128
GCM模式时, 需要设置为 IV_LEN_96
返回值#
0:成功,其他值:失败
示例说明#
AES::begin(AES_ECB, AES_128);
end#
描述#
关闭 AES 模块
语法#
static void end();
返回值#
无
示例说明#
AES::end();
setDataLen#
描述#
设置需要处理的数据总长度
语法#
static int setDataLen(size_t dataLen);
参数#
dataLen
数据长度
返回值#
0:成功,其他值:失败
示例说明#
AES::setDataLen(16);
setKey#
描述#
设置加解密使用的密钥
语法#
static int setKey(const uint8_t *key, uint8_t len);
参数#
key
密钥len
密钥长度,需要与begin
中设置的一致
返回值#
0:成功,其他值:失败
示例说明#
uint8_t key[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f};
AES::setKey(key, 16);
setIV#
描述#
设置加解密使用的初始化向量(IV)
语法#
static int setIV(const uint8_t *iv, uint8_t len);
iv
初始化向量len
初始化向量长度,需要与begin
中设置的一致
返回值#
0:成功,其他值:失败
示例说明#
待补充…
encrypt#
描述#
加密数据
语法#
static int encrypt(uint8_t *input, uint8_t *output, size_t len);
参数#
input
输入数据(未加密)output
输出数据(加密后)len
数据长度
返回值#
0:成功,其他值:失败
示例说明#
uint8_t data[16] = "1234567890";
uint8_t output[16];
AES::encrypt(data, output, 16);
decrypt#
描述#
解密数据
语法#
static int decrypt(uint8_t *input, uint8_t *output, size_t len);
参数#
input
输入数据(加密前)output
输出数据(解密后)len
数据长度
返回值#
0:成功,其他值:失败
示例说明#
AES::decrypt(output, data, 16);
gcmSetAAD#
描述#
GCM 模式下使用,获取附加消息
语法#
static int gcmSetAAD(uint8_t *aad, uint8_t len);
参数#
aad
附加消息len
附加消息长度
返回值#
0:成功,其他值:失败
示例说明#
待补充…
gcmGetTag#
描述#
GCM 模式下使用,获取附加消息产生的 TAG
语法#
static int gcmGetTag(uint8_t *gcmTag);
参数#
gcmTag
附加消息产生的 TAG
返回值#
0:成功,其他值:失败
示例说明#
待补充…
例程 - aes_ecb_128.ino#
`AES_128` 加解密测试
以下程序是一个AES加解密示例。它使用ECB模式和128位密钥对16字节的数据进行加密和解密,输出加密后和解密后的结果。
在setup函数中,首先定义了一个16字节的密钥和16字节的明文数据,然后初始化AES实例,设置加密模式和密钥,接着调用AES::encrypt函数对数据进行加密,将结果输出,并清空明文数据。接下来,调用AES::decrypt函数对加密后的数据进行解密,将结果输出。
需要注意的是,程序中要使用K210的AES库,因此需要包含相应的头文件和使用命名空间K210。还需要确保明文数据长度为16字节,密钥长度为128位。同时,在使用完AES实例后,需要调用AES::end函数释放资源。
#include "Arduino.h"
#include "AES.h"
using namespace K210;
/**
enc:743ED9E1867A2B359AD5DA3D7811B234
dec:31323334353637383930000000000000
*/
void setup() {
//定义一个16字节的密钥
uint8_t key[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f};
//定义一个16字节的明文
uint8_t data[16] = "1234567890";
//定义一个16字节的密文
uint8_t output[16];
Serial.begin(115200);
while (!Serial) {
;
}
//开始加密
AES::begin(AES_ECB, AES_128);
//设置密钥
AES::setKey(key, 16);
//设置明文长度
AES::setDataLen(16);
//加密
AES::encrypt(data, output, 16);
//输出密文
Serial.printf("enc:");
for(int i = 0; i < 16; i++) {
Serial.printf("%02X", output[i]);
}
Serial.printf("\r\n");
//清空明文
rt_memset(data, 0, 16);
//设置密文长度
AES::setDataLen(16);
//解密
AES::decrypt(output, data, 16);
//输出明文
Serial.printf("dec:");
for(int i = 0; i < 16; i++) {
Serial.printf("%02X", data[i]);
}
Serial.printf("\r\n");
//结束加密
AES::end();
}
void loop() {
}