返回列表 发新帖我要提问本帖赏金: 30.00元(功能说明)

[技术讨论] 【每周分享】利用SHA204给MCU做一个IP保护

[复制链接]
 楼主| mxkw0514 发表于 2025-3-21 17:05 | 显示全部楼层 |阅读模式
<
本帖最后由 mxkw0514 于 2025-3-28 09:56 编辑

#申请原创#@21小跑堂

什么是IP呢?
通俗的来讲,IP可以是专利、设计、商标、版权、固件、算法、协议栈等。
为什么要保护IP呢?
保护IP可以最大限度地保证生产者地经济效益,促进研发人地创新,维护市场地公平竞争。

今天我们利用硬件加密芯片给MCU做一个IP保护系统,保证MCU的核心程序运行的安全。具体的实现流程是:MCU和外部加密IC都存储着一对相同的共享密钥,MCU向加密IC发出随机数质询,加密IC会向MCU返回一个32字节的随机数;然后MCU将共享密钥(存储在MCU端)与随机数进行SHA2哈希运算而生成一个256bitMAC值,加密IC将共享密钥(存储在加密IC)进行SHA2哈希运算而生成一个256 bit的MAC值;最后MCU会比较这两个MAC值,如果相同,则往下运行核心程序。框图如下所示:

8位单片机是没有硬件加密模块的,如果也要对IP进行保护,就需要使用外部加密IC进行身份验证。硬件加密相较于软件加密,是有诸多好处的,硬件加密能够在整个芯片内部进行主动屏蔽,可以防止微探针、辐射和时序的攻击。我们来看一下CryptoAuthentication器件的大致框图。紫色的是防止外界分析数据的掩膜;橙色的是加密引擎,不同的加密IC支持不同的加密算法;蓝色的是EEP,用于存入密钥和加密数据;黄色的是随机数发生器,用于产生随机数;黑色的是单调计数器,用于限制使用的次数,蓝色的是唯一序列码,就算被读出不也会影响到同类其它产品。


下面我们就以PIC18F47Q10和ATSHA204为例,来实现一个简单的IP保护测试例程。PIC18F47Q10是一款高端的8位单片机,该单片机的时钟最高可以跑到64MHz,具有两个外部中断入口地址,也就是说具有两个硬件中断优先级(中断8位单片机只有一个),当然51或者ARM架构的单片机是有很多硬件中断优先级,有好处也有坏处。ATSHA204是一款,本次使用的ATSHA204支持SHA256加密算法,具有IIC或者单总线通信接口,用户可以选择ACES软件(如下图所示)配置ATSHA204,也可以使用Python脚本配置ATSHA204,主要是配置密钥和防止需要保护的加密数据。



这里我们选择使用ACES软件配置ATSHA204,先将加密IC放在硬件工具的座子上(通过IIC接口),连接PC与硬件工具,打开ACES软件,选择加密IC信号,之后分别配置不同的数据槽,数据槽的框图如下所示。密钥放在Slot0或Slot1,私密数据放在Slot3-Slot7里面,需要注意的是,只有锁定配置区(不能再更改密钥),才能在数据区放入数据区。

下面放入此次测试例程的主程序代码,使用的CryptoAuthencation库函数可以利用MPLAB的MCC插件自动生成,生成的相关库函数都有响应的注释。
  1. #include "mcc_generated_files/mcc.h"
  2. #include "cryptoauthlib.h"

  3. const uint8_t nonce_in[20] = {
  4.     0x01, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
  5.     0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
  6. };

  7. const uint8_t key0[32] = {
  8.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  9.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  10. };

  11. uint8_t mac_bytes[24] = {
  12.     0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  13.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE,
  14.     0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x00, 0x00,
  15. };

  16. // Section: Main Entry Point
  17. void main(void)
  18. {
  19.     ATCA_STATUS status;
  20.     uint8_t sn[9];
  21.     uint8_t challenge[32];
  22.     uint8_t digest[32];
  23.     uint8_t sha2_input[88];
  24.     uint8_t mac_sw[32];
  25.     // Initialize the device
  26.     SYSTEM_Initialize();

  27.     // Enable the Global Interrupts
  28.     INTERRUPT_GlobalInterruptEnable();

  29.     // Disable the Global Interrupts
  30.     //INTERRUPT_GlobalInterruptDisable();

  31.     // Enable the Peripheral Interrupts
  32.     INTERRUPT_PeripheralInterruptEnable();

  33.     // Disable the Peripheral Interrupts
  34.     //INTERRUPT_PeripheralInterruptDisable();
  35.     printf ("\r\nInitial CryptoAuthLib: \r\n");
  36.     status = atcab_init (&cfg_atsha204a_i2c_default);
  37.     if (status != ATCA_SUCCESS)
  38.     {
  39.         printf ("\tFail\r\n");
  40.         LED_SetHigh();
  41.     }
  42.     printf ("\tSuccess\r\n");
  43.     status = atcab_read_serial_number (sn);
  44.    
  45.     if (status == ATCA_SUCCESS)
  46.     {
  47.         atcab_printbin_label ("Seriel Number:\r\n", sn, 9);
  48.     }

  49.     status = atcab_nonce_rand (nonce_in, challenge);
  50.     if (status != ATCA_SUCCESS) {
  51.         printf ("Nonce Fail\n");
  52.     }
  53.     challenge[0] ^= 0x21;
  54.     atcab_printbin_label ("Challenge:\r\n", challenge, 32);
  55.    
  56. //digest是加密IC返回的哈希运算结果(加密IC将随机数challenge与加密IC内部密钥进行哈希运算)
  57.      status = atcab_mac (0x00, 0, challenge, digest);
  58.     if (status != ATCA_SUCCESS) {
  59.         printf ("Slot 0 GetMac Fail\n");

  60.     }
  61.      
  62.      atcab_printbin_label ("Digest:\r\n", digest, 32);

  63.     // MCU将共享密钥与随机数进行哈希运算,这里需要按照数据手册将密钥与一段数据组合
  64.     memcpy (sha2_input, key0, 32);
  65.     memcpy (sha2_input + 32, challenge, 32);
  66.     memcpy (sha2_input + 64, mac_bytes, 24);
  67.     status = atcac_sw_sha2_256 (sha2_input, 88, mac_sw);
  68.     if (status != ATCA_SUCCESS) {
  69.         printf ("Get SW Mac Fail\n");

  70.     }
  71.     atcab_printbin_label ("SW Digest:\r\n", mac_sw, 32);

  72.     // 将MCU哈希运算值和加密IC哈希运算值进行比较,如果相同,则运行核心程序
  73.     if (memcmp (mac_sw, digest, 32) == 0) {
  74.         printf ("Slot 0 CheckMac PASS\n");

  75. }
  76. atcab_release();

  77.     while (1)
  78.     {
  79. }
  80. }

调试、编译和下载程序,上电后,PIC18F47Q10会与ATSHA204进行身份验证,当出现下图后,就说明MCU与加密IC身份验证是成功的。也许会有人说,对称加密技术使用一对共享密钥,会带来一些隐患,比如密钥有泄露的风险,尤其是父密钥(主控的软件中有密钥),所以需要将主控软件中的密钥做些处理增加数据读出的难度。当我们要决定是使用对称加密技术还是非对称加密技术时,要考虑读出密钥的成本和产品的成本、相应的产品对应规范要求等等,所以不能抛开剂量谈毒性。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21小跑堂 打赏了 30.00 元 2025-03-28
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论

使用ATSHA204加密芯片,为MCU安全保驾护航。  发表于 2025-3-28 14:39
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

735

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部

38

主题

735

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部