使用CRC确保程序的可靠性

/ 2评 / 0

现在CRC主动碰撞有两种方法,一种是通过添加内容,一种是修改内容,修改内容对于程序储存器来说,可能会改变整个逻辑,比如说在整个算法中,有个IF判断需要改掉,那么,改掉后CRC就变了,如果CRC改变,要想得到原始碰撞,必须还得修改其他内容,依旧是增大长度或者修改内容,再修改内容可能导致其他程序逻辑错误,这样难度就变得越来越大了.可以产生碰撞的风险比较大.而且这个通过机器不太好碰撞,因为机器不知道最终执行逻辑,人工猜测时间无穷无尽.
比如我手上的MCU是这个Flash分布的.假设我程序只写到了0x08007500.我们的校验信息就是0x08007500之后的,虽然可能不太方便维护,但是,确实起到很大的保护用途.他的分区是1KB分区一次,我可以变成1.5KB分区一次,并且产生一些交叠.而我们程序是29.25KB.Flash我的分区方式示意图如下.
0KB ---------- 0.5KB ---------- 1.0KB ---------- 1.5 KB ---------- 2.0KB
CRC校验产生段是:
CRC01 = 0KB ---------- 1.5KB
CRC02 = 0.5KB ---------- 2.0KB
我们程序大小25KB,大概60Byte就可以储存CRC校验+序列号储存.而这60Byte还可以再做一些CRC运算,这样大大降低碰撞概率.如果要碰撞,你必然覆盖掉我部分CRC校验数值.必然CRC不过.当然,整个程序的校验不能只在一个地方做,应该多处体现.这样首先是杜绝了通过添加长度碰撞的(最多这一种),也大大降低了修改程序碰撞的概率.
另外,STM32F0的CRC还可以使用自定义非标准多项式,多项式可以通过芯片内一些特征来计算得到,比如CRC0是UID前32位做公式,CRC1是后32位做公式,最大程度保护程序的安全性.在熔丝,CRC,UID配合下,你的程序还是被破解,只能说做的产品真的越来越厉害了,该考虑用SHA256之类的.SHA512就暂时还没出现过碰撞.
如果实在要更安全,就SHA256,MD5,RSA一起校验.

  1. 说道:

    你这博客主题自己做的吗

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注