使用【芯片UID】实现芯片加密的代码

目录

        每个芯片都有唯一的UID,根据用户手册的存储器架构可以快速找到UID的存放地址,以PY32F403为例,UID存放在0x1FFFF5800

        在用户手册可以快速找到

        实现原理是自己写一套加密算法,读出UID,进行加密处理生成密文。生成密文后将密文保存到非易失存储器中,可以是板上存储器,也可以是FLASH。官方推荐的做法是存放到备份寄存器中,备份寄存器自带侵入检测,可以保护数据。

        执行一遍加密程序后就可以烧录APP,APP运行时解密密文,将解密后的密文与UID对比,根据自己设计的逻辑判断是否正确,如果错误就清除程序。这样即使不法商家得到了APP,没有加密程序也无法运行。具体原理就是这样,接下来是代码实现

整体架构流程

        1、FLASH相关操作

                读指定地址数据

//读半字
static inline uint16_t FLASH_Read_HalfWord(uint32_t addr)
{
    return *(__IO uint16_t *)addr;
}
//读n个半字
void FLASH_Read(uint32_t addr,uint16_t *data,uint16_t data_len)
{
    for(int i = 0; i < data_len; i++)
    {
        *(data+i) = FLASH_Read_HalfWord(addr);
        //两字节偏移
        addr += 2;
    }
}

                整片擦除

//擦除片
void FLASH_Erase_Mass(uint32_t addr)
{
    HAL_FLASH_Unlock();

    FLASH_EraseInitTypeDef pEraseInit = {
        .TypeErase = FLASH_TYPEERASE_MASSERASE,
    };
    uint32_t MassError;
    HAL_FLASH_Erase(&pEraseInit,&MassError);
    
    HAL_FLASH_Lock();
}

        2、加密程序

        读UID的代码最好放在开头,我的芯片调用完HAL_RCC_ClockConfig(&ClkInitstruct, FLASH_LATENCY_5)后Informatin block空间的数据就无法访问了

FLASH_Read(UID_ADDR,(uint16_t *)uid,6);

        一个简单的加密算法,移位后异或B4,B4就作为密钥在解密程序中使用,加密后将密文写入EEPROM 

void MU_Encrypt(void)
{
    //加密
    int i = 0;
    uint8_t swan_data;
    for(i = 0; i < 12; i++)
    {
        swan_data = uid[i] & 0x18;
        uid[i] = uid[i]<<5 | uid[i]>>5;
        uid[i] |=  swan_data;

        uid[i] ^= 0xB4;
    }

    //写入EEPROM
    MU_HK_Write_Byte(0x60,uid[0]);
    MU_HK_Write_Byte(0x61,uid[1]);
    MU_HK_Write_Byte(0x62,uid[2]);
    MU_HK_Write_Byte(0x63,uid[3]);
    MU_HK_Write_Byte(0x64,uid[4]);
    MU_HK_Write_Byte(0x65,uid[5]);
    MU_HK_Write_Byte(0x66,uid[6]);
    MU_HK_Write_Byte(0x67,uid[7]);
    MU_HK_Write_Byte(0x68,uid[8]);
    MU_HK_Write_Byte(0x69,uid[9]);
    MU_HK_Write_Byte(0x6A,uid[10]);
    MU_HK_Write_Byte(0x6B,uid[11]);
}

        3、解密程序

        很简单,只要异或和移位的顺序不要搞反就行。如果有一位对不上就擦除整片FLASH

//读取加密序列号并解密
void MU_Decrypt(void)
{
    uint8_t decrypt[12] = {0};

    decrypt[0] =  MU_HK_Read_Byte(0x60);
    decrypt[1] =  MU_HK_Read_Byte(0x61);
    decrypt[2] =  MU_HK_Read_Byte(0x62);
    decrypt[3] =  MU_HK_Read_Byte(0x63);
    decrypt[4] =  MU_HK_Read_Byte(0x64);
    decrypt[5] =  MU_HK_Read_Byte(0x65);
    decrypt[6] =  MU_HK_Read_Byte(0x66);
    decrypt[7] =  MU_HK_Read_Byte(0x67);
    decrypt[8] =  MU_HK_Read_Byte(0x68);
    decrypt[9] =  MU_HK_Read_Byte(0x69);
    decrypt[10] = MU_HK_Read_Byte(0x6A);
    decrypt[11] = MU_HK_Read_Byte(0x6B);

    //解密
    uint8_t swan_data;
    for(int i = 0; i < 12; i++)
    {
        decrypt[i] ^= 0xB4;

        swan_data = decrypt[i] & 0x18;
        decrypt[i] = decrypt[i]<<5 | decrypt[i]>>5;
        decrypt[i] |=  swan_data;

    }
    for(int i = 0; i < 12; i++)
    {
        if(decrypt[i] != uid[i])
		{
			APP_DISTORY;
		}
    }


}

小结

        可以在此基础上加强保护,例如将密文分段存储到不同的空间,使用多个密钥进行加密,使用多个加密程序生成多个密文......

### CentOS 镜像中 README 文件的作用 README 文件通常作为文档的一部分,在操作系统或软件包的分发过程中起到指导和说明的作用。对于 CentOS 的镜像而言,其 README 文件的主要意义在于提供关于该版本的操作系统的关键信息以及安装指南。 #### 1. 提供版本信息 README 文件会明确指出当前镜像是哪个具体版本的 CentOS,例如 `CentOS Linux release 7.9.2009 (Core)`[^1]。这有助于用户确认所下载的是正确的发行版,并了解与其兼容的硬件和软件环境。 #### 2. 描述安装前准备事项 在实际部署之前,用户可能需要完成一些必要的准备工作,比如安装工具 Git 或者其他依赖项。这些内容往往会在 README 中有所提及,帮助新手快速上手。 #### 3. 解决常见问题 针对可能出现的问题,如文件上传验证通过后的反馈机制——返回文件名表示成功[^2];或者如何正确配置服务端口映射等复杂场景下的解决方案也可能被记录下来以便查阅。 #### 4. 列举第三方库源地址 有时为了扩展功能,官方文档还会给出获取额外资源的方法论实例:“`wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz`” 就是用来示范怎样从外部站点拉取所需组件的例子之一[^3]。 #### 5. 展示高级设置教程 除了基本操作外,更深入的技术细节也会包含其中,例如为了让 NVM 成为全局变量而修改特定路径下的脚本文件 `/etc/profile.d/nvm.sh` [^4] ,或者是利用 FTP 协议传输大容量数据时推荐采用 Binary Mode 来保持文件完整性[^5]。 综上所述,README 不仅是一个简单的介绍性文本,更是连接开发者与最终用户的桥梁,它承载着丰富的背景资料和技术支持,使得整个安装过程更加顺畅高效。 ```bash # 示例命令展示如何查看本地是否存在类似的 readme 文档 ls /path/to/your/downloaded/image/*.txt | grep -i "readme" cat /path/to/found/readme.txt ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值