GD32f303 flash加密

1、简介

        GD32加密即将flash中程序固件保护起来,防止别人通过外部调试接口或者其他方法读取烧写的flash中的程序。防止抄袭,防止破坏。

2、mcu加密方式

        <1> 写特定配置字

        <2>增加外部加密芯片

        <3> 对程序代码进行密码加密

        <4> 程序校验芯片唯一的ID

2.1 配置字加密

        mcu厂商在设计芯片时在芯片中增加特定的非易失性存储,该存储可能是flash的特定地址区域。用户通过外部工具或在程序的特定地址写入使能存储保护的值。配置加密在芯片完成上电时序后才会生效。

        一般功能:

               <1>  失能调试接口(JTAG/SWD)
               <2> 使能调试接口,但不允许调试器连接内核和访问flash和RAM空间

               <3> 关闭读写flash的ISP指令

                <4>禁止初芯片正常执行程序外读flash操作

                <5>禁止芯片从外部接口或RAM启动执行代码 

         应用场景:

                常用在程序存储在芯片内部flash的系统中。如NXP LPC系列MCU、GD32系列MCU、NXPKineits Cortex-M 系列。

2.2  外接加密芯片

        通过程序与外部加密IC的交互来确认程序是否进一步执行。

        利用芯片随机数外设或者其他能产生随机数的机制,每次上电后系统取得一个随机数,并将这个随机数通过类似I2C的协议传给外部的硬件加密IC。随后系统按先前约定的算法进行结果计算,等待外部IC接收到随机数并算出结果后,外部IC会将计算结果传回给系统。如果系统的计算结果和外部IC的计算结果相同,则说明外部的加密IC存在

           应用场景:

                     用在用户对代码中关键算法的加密,算法通常会以Lib的方式提供,只有购买了对应加密芯片(类似于产品密钥)的客户才能够使用算法程序。

2.3 UID检验加密

       当下几乎所有处理器内部都包含UID,可以通过直接寻址读取或者IAP指令获得。

        方式一:用户在烧写程序时,读取一次芯片UID将其写入Flash特定区域。在程序启动时直接读取UID和Flash内部的数值进行比较决定是否启动

        方式二:用户读取UID后通过私有密钥将UID加密之后的信息写入Flash特定地址,例如Flash的最后一个扇区。程序启动时,首先读取芯片UID并通过同样的密钥和算法进行计算后与Flash中的数值进行比较决定是否启动。

        其中第一种最容易被破解,第二种也存在潜在风险,为了增强第二种的安全性,可以将加密后的数据拆分后分别存放到Flash的不同位置,运行时再组合。

        应用场景:

                主要用在一些不需要太多保护的协议栈上,例如LoRa协议栈、文件系统、私有操作系统等。协议栈相对算法的价值会低一些,增加加密芯片的成本显得过高。

同时这种方式也可延伸为使用PID(每个型号的ID相同)来区分设备型号。

2.4  程序固件加密

        指通过私有密钥将整个程序固件加密计算后生成密文,使得程序即使被其他人拿到后也不可能被反编译。这种加密方式通常需要有一段地址存储密钥和解密程序,他们可以是芯片内部Bootloader或用户自己的Bootloader。

        应用场景:

                主要用于芯片没有内部Flash或Flash较小,以及需要给用户升级固件的产品上。

        例如:芯片从外部Flash启动时,外部Flash很容易被拷贝,盗版。这种应用通常芯片内部具备OTP区域用于编程密钥。

                芯片内部Flash较小时可以将算法等文件放置在外部Flash中,运行时解密到内部RAM执行。密钥通常和内部Flash的程序一同存储;

                产品需要后期升级功能算法的项目中,可以在Bootloader中放置解密程序,升级的过程中,Bootloader将收到的固件解密烧写到内部Flash中。这样既可以随意发送产品更新固件,同时不用担心知识产权被侵害。

备注: 以上参考https://www.lmlphp.com/user/58551/article/item/2108933/

3、GD32加密例程

        GD32内部包含一个FMC外设。FMC提供了一个安全保护功能来阻止非法读取闪存。此功能可以很好地保护软件和固件免受非法的用户操作。

        GD32F303标准库中已提供相关开启flash读保护的函数。(见gd32f30x_fmc.h)

/* read protect configure */
#define FMC_NSPC                   ((uint8_t)0xA5U)               /*!< no security protection */
#define FMC_USPC                   ((uint8_t)0xBBU)               /*!< under security protection */

/*!
    \brief      configure security protection
    \param[in]  ob_spc: specify security protection
      \arg        FMC_NSPC: no security protection
      \arg        FMC_USPC: under security protection
    \param[out] none
    \retval     state of FMC, refer to fmc_state_enum
*/
fmc_state_enum ob_security_protection_config(uint8_t ob_spc)
{
    fmc_state_enum fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT);

    if(FMC_READY == fmc_state){
        FMC_CTL0 |= FMC_CTL0_OBER;
        FMC_CTL0 |= FMC_CTL0_START;
    
        /* wait for the FMC ready */
        fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT);
    
        if(FMC_READY == fmc_state){
            /* reset the OBER bit */
            FMC_CTL0 &= ~FMC_CTL0_OBER;
      
            /* start the option byte program */
            FMC_CTL0 |= FMC_CTL0_OBPG;
       
            OB_SPC = (uint16_t)ob_spc;

            /* wait for the FMC ready */
            fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); 
    
            if(FMC_TOERR != fmc_state){
                /* reset the OBPG bit */
                FMC_CTL0 &= ~FMC_CTL0_OBPG;
            }
        }else{
            if(FMC_TOERR != fmc_state){
                /* reset the OBER bit */
                FMC_CTL0 &= ~FMC_CTL0_OBER;
            }
        }
    }
    /* return the FMC state */
    return fmc_state;
}

/**************************以上见gd32f30x_fmc.h**********************************/


/* Flash 开启读保护 */
void Flash_ReadProtection_Enable(void)
{
	  if(ob_spc_get() != SET)
    {
        /* unlock the main FMC operation */
        fmc_unlock();	// 解除 bank0 的编程限制

        /* unlock the option byte operation */
	    ob_unlock();	// 	解除 可选字节 的编程限制
	      
        /* erase the FMC option byte, unlock the FMC_CTL0 and option byte before calling this function */	    
        ob_erase();		// 可选字节擦除 这里上电默认为 A5 5A FF FF FF ... 所以这里直接整个擦除了
	    
        /* configure security protection */  
        ob_security_protection_config(FMC_USPC);	// 启停保护功能

        /* lock the option byte operation */
	    ob_lock();		// 退出 可选字节 编辑态

        /* lock the main FMC operation */
	    fmc_lock();		// 退出 bank0 编辑态
	}
		
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GD32F303是一款微控制器芯片,它可以通过利用芯片随机数外设或其他能产生随机数的机制来获取随机数。每次上电后,系统会获取一个随机数,并将其传递给外部的硬件加密IC,通过预先约定的算法进行结果计算。等待外部IC接收到随机数并计算结果后,将结果传回系统。如果系统的计算结果和外部IC的计算结果相同,则说明外部的加密IC存在。这样可以增加系统的安全性。 由于GD32F303内部包含FMC外设,该外设提供了安全保护功能,可以阻止非法读取闪存。这一功能可以有效保护软件和固件免受非法用户操作的侵害。 此外,mcu厂商在设计芯片时通常会在芯片中增加特定的非易失性存储,用于存储一些特定的配置信息,比如加密配置。用户可以通过外部工具或在程序的特定地址写入使能存储保护的值,以启用芯片的加密功能。这些配置在芯片完成上电时序后才会生效,从而增强了芯片的安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [GD32f303 flash加密](https://blog.csdn.net/qq_46211259/article/details/127290033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值