0


NXP Kinetis L系列:14.安全特性:加密与认证

14. 安全特性:加密与认证

在现代嵌入式系统中,安全特性变得越来越重要。NXP Kinetis L 系列单片机提供了多种加密与认证功能,以确保系统的数据安全和完整性。本节将详细介绍这些安全特性,并通过具体的代码示例来说明如何在 Kinetis L 系列单片机上实现加密和认证。
在这里插入图片描述

14.1 加密算法与硬件支持

NXP Kinetis L 系列单片机支持多种加密算法,包括对称加密算法(如 AES)和非对称加密算法(如 RSA)。这些算法可以通过硬件加速器来实现,从而提高加密和解密的性能。

14.1.1 AES 加密算法

AES(Advanced Encryption Standard)是一种对称加密算法,广泛用于数据加密。Kinetis L 系列单片机内置了 AES 硬件加速器,可以显著提高 AES 加密和解密的速度。

14.1.1.1 AES 硬件加速器的使用

AES 硬件加速器的使用需要通过配置相关的寄存器来实现。以下是一个使用 AES 硬件加速器进行数据加密的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include<string.h>// 定义 AES 密钥uint8_t key[16]={0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c};// 定义明文数据uint8_t plaintext[16]={0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34};// 定义密文数据缓冲区uint8_t ciphertext[16];// 定义 AES 控制寄存器#defineAES0_CR(AES0->CR)// 定义 AES 数据寄存器#defineAES0_DATA(AES0->DATA)// 定义 AES 密钥寄存器#defineAES0_KEY(AES0->KEY)// 定义 AES 状态寄存器#defineAES0_SR(AES0->SR)// 定义 AES 控制寄存器位#defineAES0_CR_MODE(0x7U<<28)// 模式选择#defineAES0_CR_MODE_ECB(0x0U<<28)// 电子密码本模式#defineAES0_CR_MODE_CBC(0x1U<<28)// 密码分组链接模式#defineAES0_CR_MODE_CFB(0x2U<<28)// 密码反馈模式#defineAES0_CR_MODE_OFB(0x3U<<28)// 输出反馈模式#defineAES0_CR_MODE_CTR(0x4U<<28)// 计数器模式#defineAES0_CR_KEYSIZE(0x3U<<16)// 密钥大小选择#defineAES0_CR_KEYSIZE_128(0x0U<<16)// 128 位密钥#defineAES0_CR_KEYSIZE_192(0x1U<<16)// 192 位密钥#defineAES0_CR_KEYSIZE_256(0x2U<<16)// 256 位密钥#defineAES0_CR_DE(1U<<1)// 解密使能位#defineAES0_CR_SL(1U<<0)// 密钥加载使能位voidAES_Init(void){// 使能 AES 模块时钟
    SIM_SCGC6 |= SIM_SCGC6_AES_MASK;// 初始化 AES 控制寄存器
    AES0_CR = AES0_CR_MODE_ECB | AES0_CR_KEYSIZE_128 | AES0_CR_SL;}voidAES_Encrypt(uint8_t*key,uint8_t*plaintext,uint8_t*ciphertext){// 加载密钥
    AES0_KEY =*(uint32_t*)key;
    AES0_KEY =*(uint32_t*)(key +4);
    AES0_KEY =*(uint32_t*)(key +8);
    AES0_KEY =*(uint32_t*)(key +12);// 加载明文数据
    AES0_DATA =*(uint32_t*)plaintext;
    AES0_DATA =*(uint32_t*)(plaintext +4);
    AES0_DATA =*(uint32_t*)(plaintext +8);
    AES0_DATA =*(uint32_t*)(plaintext +12);// 设置加密模式
    AES0_CR &=~AES0_CR_DE_MASK;// 开始加密
    AES0_CR |= AES0_CR_SL;// 等待加密完成while(!(AES0_SR & AES0_SR_RDF_MASK));// 读取密文数据*(uint32_t*)ciphertext = AES0_DATA;*(uint32_t*)(ciphertext +4)= AES0_DATA;*(uint32_t*)(ciphertext +8)= AES0_DATA;*(uint32_t*)(ciphertext +12)= AES0_DATA;}intmain(void){AES_Init();// 显示明文数据printf("Plaintext: ");for(int i =0; i <16; i++){printf("%02x ", plaintext[i]);}printf("\n");// 加密数据AES_Encrypt(key, plaintext, ciphertext);// 显示密文数据printf("Ciphertext: ");for(int i =0; i <16; i++){printf("%02x ", ciphertext[i]);}printf("\n");while(1){// 主循环}}

14.1.2 RSA 加密算法

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,常用于数据签名和密钥交换。Kinetis L 系列单片机虽然不直接支持 RSA 硬件加速器,但可以通过软件实现 RSA 算法。

14.1.2.1 软件实现 RSA 加密

以下是一个使用 MbedTLS 库实现 RSA 加密的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include"mbedtls/rsa.h"#include"mbedtls/platform.h"#include<stdio.h>#include<string.h>// 定义 RSA 密钥constchar*public_key_pem ="-----BEGIN PUBLIC KEY-----\n""MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqF+5uG3eXYI5p7y2xGpJ\n""zXp33ZP0DqX0tD5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF\n""5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZm\n""-----END PUBLIC KEY-----";constchar*private_key_pem ="-----BEGIN RSA PRIVATE KEY-----\n""MIIEpAIBAAKCAQEAqF+5uG3eXYI5p7y2xGpJzXp33ZP0DqX0tD5aO8lF5x0kZmzX5\n""aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0\n""kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO8lF5x0kZmzX5aO\n""-----END RSA PRIVATE KEY-----";// 定义明文数据uint8_t plaintext[]="Hello, World!";// 定义密文数据缓冲区uint8_t ciphertext[256];// 定义解密后的数据缓冲区uint8_t decrypted_text[256];

mbedtls_rsa_context rsa_ctx;voidRSA_Init(void){mbedtls_rsa_init(&rsa_ctx, MBEDTLS_RSA_PKCS_V15,0);}intRSA_Encrypt(mbedtls_rsa_context *ctx,constchar*plaintext,uint8_t*ciphertext){int ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA;size_t olen;// 设置 RSA 模块为公钥加密
    ret =mbedtls_rsa_set_pubkey(ctx, public_key_pem,NULL);if(ret !=0){return ret;}// 进行 RSA 加密
    ret =mbedtls_rsa_pkcs1_encrypt(ctx,NULL,NULL, MBEDTLS_RSA_PUBLIC,strlen(plaintext),(constuint8_t*)plaintext, ciphertext,&olen);if(ret !=0){return ret;}return0;}intRSA_Decrypt(mbedtls_rsa_context *ctx,constuint8_t*ciphertext,uint8_t*decrypted_text){int ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA;size_t olen;// 设置 RSA 模块为私钥解密
    ret =mbedtls_rsa_set_privkey(ctx, private_key_pem,NULL);if(ret !=0){return ret;}// 进行 RSA 解密
    ret =mbedtls_rsa_pkcs1_decrypt(ctx,NULL,NULL, MBEDTLS_RSA_PRIVATE,&olen, ciphertext, decrypted_text,sizeof(decrypted_text));if(ret !=0){return ret;}return0;}intmain(void){RSA_Init();// 显示明文数据printf("Plaintext: %s\n", plaintext);// 加密数据int ret =RSA_Encrypt(&rsa_ctx, plaintext, ciphertext);if(ret ==0){// 显示密文数据printf("Ciphertext: ");for(int i =0; i <256; i++){printf("%02x ", ciphertext[i]);}printf("\n");// 解密数据
        ret =RSA_Decrypt(&rsa_ctx, ciphertext, decrypted_text);if(ret ==0){// 显示解密后的数据printf("Decrypted Text: %s\n", decrypted_text);}else{printf("RSA decryption failed\n");}}else{printf("RSA encryption failed\n");}while(1){// 主循环}}

14.2 认证机制

认证机制用于验证数据的完整性和来源的可靠性。NXP Kinetis L 系列单片机支持多种认证算法,包括 HMAC 和 AES-CCM。

14.2.1 HMAC 认证

HMAC(Hash-based Message Authentication Code)是一种基于哈希函数的消息认证码,常用于数据完整性验证和认证。Kinetis L 系列单片机可以通过软件实现 HMAC 算法。

14.2.1.1 HMAC 的使用

以下是一个使用 MbedTLS 库实现 HMAC 认证的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include"mbedtls/platform.h"#include"mbedtls/md.h"#include<stdio.h>#include<string.h>// 定义 HMAC 密钥uint8_t hmac_key[16]={0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b};// 定义消息数据uint8_t message[]="Hello, World!";// 定义 HMAC 输出缓冲区uint8_t hmac_output[32];voidHMAC_Init(void){mbedtls_platform_setup(NULL);}intHMAC_Compute(mbedtls_md_type_t md_type,constuint8_t*key,size_t key_len,constuint8_t*input,size_t input_len,uint8_t*output,size_t output_len){int ret =0;mbedtls_md_context_t ctx;constmbedtls_md_info_t*md_info;// 初始化 HMAC 上下文mbedtls_md_init(&ctx);
    md_info =mbedtls_md_info_from_type(md_type);if(md_info ==NULL){return MBEDTLS_ERR_MD_BAD_INPUT_DATA;}// 设置密钥
    ret =mbedtls_md_setup(&ctx, md_info,1);if(ret !=0){return ret;}

    ret =mbedtls_md_hmac_starts(&ctx, key, key_len);if(ret !=0){return ret;}// 更新消息数据
    ret =mbedtls_md_hmac_update(&ctx, input, input_len);if(ret !=0){return ret;}// 计算 HMAC
    ret =mbedtls_md_hmac_finish(&ctx, output);if(ret !=0){return ret;}// 释放 HMAC 上下文mbedtls_md_free(&ctx);return0;}intmain(void){HMAC_Init();// 计算 HMACint ret =HMAC_Compute(MBEDTLS_MD_SHA256, hmac_key,sizeof(hmac_key), 
                           message,sizeof(message), hmac_output,sizeof(hmac_output));if(ret ==0){// 显示 HMAC 输出printf("HMAC (SHA-256): ");for(int i =0; i <32; i++){printf("%02x ", hmac_output[i]);}printf("\n");}else{printf("HMAC computation failed\n");}while(1){// 主循环}}

14.2.2 AES-CCM 认证

AES-CCM(Counter with CBC-MAC)是一种同时提供加密和认证的模式。Kinetis L 系列单片机支持 AES-CCM 模式,可以通过硬件加速器来实现。

14.2.2.1 AES-CCM 的使用

以下是一个使用 AES-CCM 模式进行数据加密和认证的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include"mbedtls/aes.h"#include"mbedtls/platform.h"#include<stdio.h>#include<string.h>// 定义 AES 密钥uint8_t key[16]={0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c};// 定义明文数据uint8_t plaintext[16]={0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34};// 定义密文数据缓冲区uint8_t ciphertext[16];// 定义认证标签缓冲区uint8_t tag[16];// 定义 AES-CCM 非加密数据uint8_t additional_data[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};// 定义 AES-CCM 控制参数
mbedtls_aes_ccm_context ccm_ctx;voidAES_CCM_Init(void){// 初始化 AES-CCM 上下文mbedtls_aes_ccm_init(&ccm_ctx);}intAES_CCM_Encrypt(uint8_t*key,uint8_t*nonce,size_t nonce_len,constuint8_t*additional_data,size_t additional_data_len,constuint8_t*plaintext,size_t plaintext_len,uint8_t*ciphertext,uint8_t*tag,size_t tag_len){int ret =0;// 设置密钥
    ret =mbedtls_aes_setkey_enc(&ccm_ctx.aes, key,128);if(ret !=0){return ret;}// 进行 AES-CCM 加密和认证
    ret =mbedtls_aes_ccm_encrypt(&ccm_ctx, nonce, nonce_len, additional_data, additional_data_len,
                                 plaintext, plaintext_len, ciphertext, tag, tag_len);if(ret !=0){return ret;}return0;}intAES_CCM_Decrypt(uint8_t*key,uint8_t*nonce,size_t nonce_len,constuint8_t*additional_data,size_t additional_data_len,constuint8_t*ciphertext,size_t ciphertext_len,constuint8_t*tag,size_t tag_len,uint8_t*decrypted_text){int ret =0;// 设置密钥
    ret =mbedtls_aes_setkey_dec(&ccm_ctx.aes, key,128);if(ret !=0){return ret;}// 进行 AES-CCM 解密和认证
    ret =mbedtls_aes_ccm_decrypt(&ccm_ctx, nonce, nonce_len, additional_data, additional_data_len,
                                 ciphertext, ciphertext_len, decrypted_text, tag, tag_len);if(ret !=0){return ret;}return0;}intmain(void){AES_CCM_Init();// 定义随机数生成的 nonceuint8_t nonce[13]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c};// 显示明文数据printf("Plaintext: ");for(int i =0; i <16; i++){printf("%02x ", plaintext[i]);}printf("\n");// 加密数据int ret =AES_CCM_Encrypt(key, nonce,sizeof(nonce), 
                             additional_data,sizeof(additional_data), 
                             plaintext,sizeof(plaintext), 
                             ciphertext, tag,sizeof(tag));if(ret ==0){// 显示密文数据printf("Ciphertext: ");for(int i =0; i <16; i++){printf("%02x ", ciphertext[i]);}printf("\n");// 显示认证标签printf("Tag: ");for(int i =0; i <16; i++){printf("%02x ", tag[i]);}printf("\n");// 解密数据uint8_t decrypted_text[16];
        ret =AES_CCM_Decrypt(key, nonce,sizeof(nonce), 
                             additional_data,sizeof(additional_data), 
                             ciphertext,sizeof(ciphertext), 
                             tag,sizeof(tag), decrypted_text);if(ret ==0){// 显示解密后的数据printf("Decrypted Text: ");for(int i =0; i <16; i++){printf("%02x ", decrypted_text[i]);}printf("\n");}else{printf("AES-CCM decryption failed\n");}}else{printf("AES-CCM encryption failed\n");}while(1){// 主循环}}

14.3 安全引导加载程序

安全引导加载程序(Secure Bootloader)是确保嵌入式系统安全启动的重要机制。NXP Kinetis L 系列单片机提供了多种安全引导加载程序选项,以防止非法代码的加载和执行。

14.3.1 安全引导加载程序的配置

安全引导加载程序的配置需要通过特定的寄存器和存储器设置来完成。以下是一个配置安全引导加载程序的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include<string.h>// 定义安全引导加载程序的配置参数#defineFCFG1_FPROT0x400/* 保护 Flash 存储器 */#defineFCFG1_FSEC0x00/* 设置为安全模式 */#defineFCFG1_FOPT0x10/* 启用安全引导加载程序 */voidSecure_Bootloader_Config(void){// 使能 Flash 模块时钟
    SIM_SCGC6 |= SIM_SCGC6_FTFx_MASK;// 配置 Flash 保护寄存器
    FTFL_FPROT = FCFG1_FPROT;// 配置 Flash 安全寄存器
    FTFL_FSEC = FCFG1_FSEC;// 配置 Flash 选项寄存器
    FTFL_FOPT = FCFG1_FOPT;}intmain(void){Secure_Bootloader_Config();// 显示配置结果printf("Flash Protection: 0x%02x\n", FTFL_FPROT);printf("Flash Security: 0x%02x\n", FTFL_FSEC);printf("Flash Options: 0x%02x\n", FTFL_FOPT);while(1){// 主循环}}

14.4 安全存储

安全存储用于保护嵌入式系统中的敏感数据,如密钥和认证信息。Kinetis L 系列单片机提供了多种安全存储选项,包括硬件安全模块(HSM)和 Flash 存储保护。

14.4.1 硬件安全模块(HSM)

硬件安全模块(HSM)是一种集成的安全模块,用于存储和管理密钥。以下是一个使用 HSM 进行密钥存储的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include<string.h>// 定义 HSM 密钥uint8_t hsm_key[16]={0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c};voidHSM_Init(void){// 使能 HSM 模块时钟
    SIM_SCGC6 |= SIM_SCGC6_HSM_MASK;// 配置 HSM 寄存器
    HSM_CR = HSM_CR_HSMEN_MASK;// 使能 HSM
    HSM_KEY =*(uint32_t*)hsm_key;
    HSM_KEY =*(uint32_t*)(hsm_key +4);
    HSM_KEY =*(uint32_t*)(hsm_key +8);
    HSM_KEY =*(uint32_t*)(hsm_key +12);}intmain(void){HSM_Init();// 显示 HSM 密钥printf("HSM Key: ");for(int i =0; i <16; i++){printf("%02x ", hsm_key[i]);}printf("\n");while(1){// 主循环}}
14.4.2 Flash 存储保护

Flash 存储保护用于防止对 Flash 存储器的非法访问。以下是一个使用 Flash 存储保护的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include<string.h>// 定义 Flash 保护参数#defineFCFG1_FPROT0xFF/* 完全保护 Flash 存储器 */#defineFCFG1_FSEC0x00/* 设置为安全模式 */#defineFCFG1_FOPT0x10/* 启用 Flash 保护 */voidFlash_Protection_Config(void){// 使能 Flash 模块时钟
    SIM_SCGC6 |= SIM_SCGC6_FTFx_MASK;// 配置 Flash 保护寄存器
    FTFL_FPROT = FCFG1_FPROT;// 配置 Flash 安全寄存器
    FTFL_FSEC = FCFG1_FSEC;// 配置 Flash 选项寄存器
    FTFL_FOPT = FCFG1_FOPT;}intmain(void){Flash_Protection_Config();// 显示配置结果printf("Flash Protection: 0x%02x\n", FTFL_FPROT);printf("Flash Security: 0x%02x\n", FTFL_FSEC);printf("Flash Options: 0x%02x\n", FTFL_FOPT);while(1){// 主循环}}

14.5 安全调试接口

安全调试接口用于防止非法调试和数据泄露。Kinetis L 系列单片机提供了多种安全调试接口配置选项,以确保系统的调试安全。

14.5.1 安全调试接口的配置

安全调试接口的配置需要通过特定的寄存器设置来完成。以下是一个配置安全调试接口的示例代码:

#include"MKL25Z.h"// 引入 Kinetis L 系列单片机头文件#include<string.h>// 定义安全调试接口配置参数#defineFTFL_FSEC0x03/* 禁止 JTAG 和 SWD 调试接口 */voidSecure_Debug_Config(void){// 使能 Flash 模块时钟
    SIM_SCGC6 |= SIM_SCGC6_FTFx_MASK;// 配置 Flash 安全寄存器
    FTFL_FSEC = FTFL_FSEC;}intmain(void){Secure_Debug_Config();// 显示配置结果printf("Flash Security: 0x%02x\n", FTFL_FSEC);while(1){// 主循环}}

14.6 总结

在现代嵌入式系统中,确保数据安全和完整性是至关重要的。NXP Kinetis L 系列单片机提供了多种加密与认证功能,包括 AES 硬件加速器、软件实现的 RSA 算法、HMAC 认证、AES-CCM 认证、安全引导加载程序、安全存储和安全调试接口。通过合理的配置和使用这些功能,可以显著提高系统的安全性。希望本章的内容能帮助读者更好地理解和应用 Kinetis L 系列单片机的安全特性。


本文转载自: https://blog.csdn.net/chenlz2007/article/details/143315009
版权归原作者 chenlz2007 所有, 如有侵权,请联系我们删除。

“NXP Kinetis L系列:14.安全特性:加密与认证”的评论:

还没有评论