首页 > 其他分享 >使用【芯片UID】实现芯片加密的代码

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

时间:2024-12-31 09:25:52浏览次数:7  
标签:加密 UID 芯片 decrypt MU HK Read Byte uid

目录

概要

整体架构流程

        1、FLASH相关操作

        2、加密程序

        3、解密程序

小结


概要

        每个芯片都有唯一的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;
		}
    }


}

小结

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

标签:加密,UID,芯片,decrypt,MU,HK,Read,Byte,uid
From: https://blog.csdn.net/weixin_63723467/article/details/144839384

相关文章

  • CH5XX AES加密
    1.CH5XX支持的是128bitAES加密(ECB)。2.加解密一共就两个函数,一个加密,一个解密,内容如下:/***@briefEncryptdata**@paramkey-key秘匙*@paramplaintextData-originaldata原始数据*@paramencryptData-encrypteddata......
  • 【教程4>第4章>第23节】costas环硬件测试1——管脚约束,芯片设置,ila设置,程序改写
    欢迎订阅FPGA/MATLAB/Simulink系列教程《★教程1:matlab入门100例》《★教程2:fpga入门100例》《★教程3:simulink入门60例》《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》目录1.软件版本2.硬件测试准备工作总结2.1开发板使用2.2定义信号发射源程序2.3......
  • 数据保护三剑客:编码、加密与令牌化
    ......
  • h5播放 加密m3u8文件
    h5播放加密m3u8文件1.opensslrand16>enc.key 2. opensslrand16-hex #获取字符串,key_info.txt文件用3.新建文件:key_info.txt http://127.0.0.1:8080/enc.keyenc.keyd7e6e8dc49a8eddc07ee028643a7a693启动web目录python3-mhttp.server8080   生成文......
  • 常见加密方式:对称加密,非对称加密和哈希算法
    前言长度位数,字符规律数据加密是一种保护数据安全的技术,通过将数据明文转换为不易被未授权的人理解的形式密文,防止数据泄露、串改和滥用。对称加密加密和解密使用同一密钥,加解密速度快,适合加密大量数据。但密钥需要安全地存储和传输,否则容易窃取,破坏数据地保密性。DES明......
  • 超低功耗段LCD液晶段码显示屏驱动芯片(ic)VKL128 LQFP44 I2C通信接口/可配置4种功耗模
    产品品牌:永嘉微电/VINKA产品型号:VKL128封装形式:SSOP44概述VKL128是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于......
  • 【YashanDB知识库】druid连接池查询空间数据报错read time out
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7849007.html?templateId=1718516【标题】druid连接池查询空间数据报错readtimeout【问题分类】驱动使用【关键字】druid,gis,readtimeout,sockettimeout【问题描述】sql查询空间数据,用HikariCP不......
  • 若依(spring-cloud)修改登陆密码加密算法
    文章目录前言一、解决办法二、解决过程1为啥要改加密算法2找不到校验代码总结前言若依是一套快速集成各种中间件的配套Java后端框架,本文旨在描述修改其登陆的加密算法。文章的大前提是后端框架是若依哈,不是的话可以跳过了~!文章创作原因:系统针对登陆密码是密文......
  • 3. Quick Start Guide 快速入门指南
    ForgettingstartedwithLALRPOP,it'sprobablybestifyoureadthetutorial,whichwillintroduceyoutothesyntaxofLALRPOPfilesandsoforth.GPT:要开始使用LALRPOP,最好的方法是阅读教程,它会介绍LALRPOP文件的语法以及其他相关内容。MS:要开始使用LAL......
  • 计算机毕业设计-基于Python+Django的信息加密解密网站系统项目开发实战(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......