【野火 fireFlasher Mini 脱机烧录器】UID加密测试 - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

范成功 关注 私信
[文章]

【野火 fireFlasher Mini 脱机烧录器】UID加密测试

移植算法

算法在:野火【fireFlasher Mini脱机下载器】模块资料\UID加密代码资料\对应单独加密代码\YH_Enctyption.zip里
移植完成之后增加测试命令,如下:
image.png

命令使用方式如下:

image.png

加密工具开发

加密工具源码如下:

static int encrypt(int argc, char *argv[])
{
    if(argc != 4)
    {
        encrypt_help();
        return 0;
    }
    int len = str2hex(argv[3]);
    if(len == 4 || len == 8 || len == 12)
    {
        char *key_str = argv[1];
        char *uid_addr_str = argv[2];
        rt_uint32_t *uid_addr;
        uint8_t data[len];
        uint8_t key[len];
        uint8_t uid[len];
        uid_addr = (rt_uint32_t *)str2hex(uid_addr_str);
        *(rt_uint32_t *)&uid[0] = uid_addr[0];
        if(len > 4)
        {
            *(rt_uint32_t *)&uid[4] = uid_addr[1];
        }
        if(len > 8)
        {
            *(rt_uint32_t *)&uid[8] = uid_addr[2];
        }
        rt_memset(key, 0, len);
        str2bytes(key_str, key, len);
        uid_encrypt_generate(data, uid, key, len);
        print_arr("data", data, len);
        print_arr("uid",  uid,  len);
        print_arr("key",  key,  len);
    }
    else
    {
        encrypt_help();
    }
    return 0;
}

参数1(argv[1])是key的值,之间是十六进制的内容,不能加'0x'
参数2(argv[2])是uid的地址,通过不同的长度,加载进不同长度的uid的数据
参数3(argv[3])是key长度,单位是字节,可以是4字节,8字节和12字节

制作烧写固件

相关参数如下:

image.png

其中密钥存储地址是0x800b15c,密钥的长度是4字节,加密的key是0x31 0x32 0x33 0x34,按确定是之后将固件烧写进烧写器,然后就可以通过烧写器烧写程序,并在0x800b15c处保存烧写器通过芯片UID和KEY计算出来的密钥了.

烧写测试

首先初始的参数,内容是0x31 0x32 0x33 0x34,具体如下:
image.png

烧录程序之后,参数的内容就被更改为烧写器计算出来的密钥了,内容是0x41 0x32 0x77 0x03,截图信息如下:

image.png

接着我们先读取一下板子的UID,APM32F103的UID地址是0x1FFFF7E8,长度是96位(12字节),可以通过mem_read命令来读取对应内存中的数据,得到UID是(内容是从低到高)0x47 0x00 0x40 0x00 0x0b 0x35 0x2e 0x31 0x31 0x53 0x4b 0x4e,因为算法使用的是4字节长度,所以使用的是低4字节的ID内容,分别是0x47 0x00 0x40 0x00,详细看下面的截图信息:

image.png

通过算法得到的密钥跟读取到的密钥进行比较:

image.png

如上图所示,算法得到的密钥是0x41 0x32 0x77 0x03,使用的UID是0x47 0x00 0x40 0x00,使用的KEY是0x31 0x32 0x33 0x34,所有的数据和烧写器使用的数据一致,得到的密钥也是和烧写器烧录的密钥一致.到此UID加密的功能测试结束了

小结

UID加密的功能还是非常有用的,希望还能加入指定范围的CRC计算,或者加入脚本的功能,比如mpy或lua等,可以让用户灵活的增加需要的算法功能以及校验功能.

更多回帖

×
发帖