移植算法
算法在:野火【fireFlasher Mini脱机下载器】模块资料\UID加密代码资料\对应单独加密代码\YH_Enctyption.zip里
移植完成之后增加测试命令,如下:
命令使用方式如下:
加密工具开发
加密工具源码如下:
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字节
制作烧写固件
相关参数如下:
其中密钥存储地址是0x800b15c,密钥的长度是4字节,加密的key是0x31 0x32 0x33 0x34,按确定是之后将固件烧写进烧写器,然后就可以通过烧写器烧写程序,并在0x800b15c处保存烧写器通过芯片UID和KEY计算出来的密钥了.
烧写测试
首先初始的参数,内容是0x31 0x32 0x33 0x34,具体如下:
烧录程序之后,参数的内容就被更改为烧写器计算出来的密钥了,内容是0x41 0x32 0x77 0x03,截图信息如下:
接着我们先读取一下板子的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,详细看下面的截图信息:
通过算法得到的密钥跟读取到的密钥进行比较:
如上图所示,算法得到的密钥是0x41 0x32 0x77 0x03,使用的UID是0x47 0x00 0x40 0x00,使用的KEY是0x31 0x32 0x33 0x34,所有的数据和烧写器使用的数据一致,得到的密钥也是和烧写器烧录的密钥一致.到此UID加密的功能测试结束了
小结
UID加密的功能还是非常有用的,希望还能加入指定范围的CRC计算,或者加入脚本的功能,比如mpy或lua等,可以让用户灵活的增加需要的算法功能以及校验功能.