打印
[应用相关]

转:浅谈通过LGT和STM32“全球唯一序列号"对抗解密的应用

[复制链接]
1588|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangfeng33|  楼主 | 2013-12-3 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近两年来在新兴的MCU上应用越来越广,其设计的初衷目的是让用户来做认证用的,虽然可以按想象中的把序号读出来,写进程序里,再用程序来校验。但是这样的话每个HEX文件都不一样,反而不利于系统的升级和维护了。
下面谈一种使用全球唯一序列号来做认证和加密的方式方法,大家可以探讨一下。本方法适用于有全球唯一序列号的LGT、STM32芯片,且内部或外部E2PROM且空间尚且够用的情况下,带加密型的E2PROM可以自由发挥。
系统中有外部E2PROM的情况时,可以先通过编程器或其他手段写入到外部E2PROM中某地址一个数据,例如在0x0010处写入0x12345678,这个地址即为序列号验证的地址。如果内部有E2PROM的在编译程序时先编译好EEP文件。确定好E2PROM内容后再向单片机写入你的程序。程序刚开始运行时先要读E2PROM看看是不是0x12345678,如果是的话则为厂家模式。如果是厂家模式时则读取自身MCU的唯一ID并通过MD5+3DES或其他不可逆算法来算出一个序列号来,并写入到0x0010地址处。如果不是厂家模式,那就是用户模式了。可以随时随地用不同的方法来读自身唯一ID并通过不可逆算法来算出序列号和0x0010地址上的数据进行比较就行了。该方法的前提是如果使用外部E2PROM时需要先编好E2PROM中的数据,切不可图省事让MCU读出为0xFF即为厂家模式,这样的话人家给你换一颗没用过的芯片就完事了。如果是内部E2PROM则要省事很多,编译程序时声明产生EEP文件就行了。那个0x12345678也不要太简单了,要复杂一些,最好再更长一些。这种方法可以初步解决芯片认证的问题。如果是盗版芯片,算出来的序列号肯定与E2PROM内的不同,哪怕是整片都被复制。盗版者也不知道需要哪些数据如何进入厂家模式来生成新的正确的序列号。
系统中只有单颗STM32没有外挂E2PROM时的情况要麻烦一些,目前我能想出的办法只有用以上的方法和IAP技术,在芯片内部找一个空间让MCU自已来写入加密后的序列号。串口下载和用编程器并行下载时都可以在芯片内部先写好0x12345678。当然也可以用程序来声明
const unsigned long SafetyIDMark __at(0x803FFF0) = 0x12345678; //在芯片0x803FFF0地址写入加密ID的初始标识
其他的就只能从IAP入手了,挥刀自宫吧。
大家可以参考我发过的帖子来找到各种常用的高级加密算法的源码“加密源码大聚齐” 。如果觉得那些不可逆算法比较麻烦,或占用资源多的话可以参考下面这个简单的。
unsigned long Encryption(unsigned long input_data, unsigned long key1, unsigned long key2, unsigned long key3, unsigned long key4)
{
    unsigned long x1, x2, x3, x4, x5, x6, x7;
    unsigned long x, y0, y4, y5;
    x = input_data &0xffff0000;
    x = x >> 16;
    x2 = x;
    x1 = 0xffff &input_data;//input_data为将要加密的数据源
    if (x1 > 65535)
         x1 = x1 - 65536;
     x3 = x1 ^ key2;
    x4 = x2 ^ key1;
    x5 = x4 + x3;
    x6 = x5 << 4;
    x7 = x6 % key4;
    y0 = x7 * key3;
    x3 = x1 + key1;
    x4 = x3 % key3;
    x5 = key4 ^ x2;
    y4 = x4 * x5;
    y5 = y0 ^ y4;
    return y5;  //加密后的数据出口
}

这是我以前用过的一种不可逆算法。别看这么简单,这个是源自某款并口彩虹加密狗的加密算法。通过移位和取模运算,那些原来的数据已经面目全非并且完全不可逆了。顺便广告一下,看了下LGT的手册。LGT单片机既有E2PROM又有全球唯一序列号,还能直接代替AVR,是个很不错的选择。就算哪天被解了密,那也是我们的荣幸,因为人家瞧得起咱们产品好。不过他们想用起来就没那么简单了,呵呵。以上方法可以应用在任何一款有唯一序列号的MCU系统中。但出于安全性考虑尽量不要使用在例如有18B20之类外设的系统上,非加密型外设的通讯数据很容易采集并仿真和伪造。至于全球唯一序列号驻留在RAM中的STC单片机如何防止内嵌木马来修改,网络上各有保贬,这里不便评论。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝