只要单片机具有真正唯一ID,就可以让加密坚不可摧

发布者:科技之翼最新更新时间:2015-10-21 来源: eefocus关键字:单片机  唯一ID  加密 手机看文章 扫描二维码
随时随地手机看文章
第一环:


ID-->F1(ID) -----》IDX,

将ID通过自定义的一个算法F1,转换为一个整数IDX , F1为不可逆运算,也不能被轻易分析,这个实际上是容易实现的。

然后,将IDX保存到EEPROM或FLASH的任何地方,我们通过编一个函数 GET_IDX()能够读出这个数即可。


第二环:

再编一个函数:

int getmy_1(){
return F1(ID)-GET_IDX()+1;
}

int getmy_0(){
return F1(ID)-GET_IDX();
}


还有一些其他自定义的函数内:都可以直接使用(F1(ID)-GET_IDX()) 来替代0; 直接用(F1(ID)-GET_IDX()+1)来替代1;


第三环:

在程序任何需要使用到1的地方,都可以考虑使用getmy_1()代替。

或即使本不使用1,也可以来用上一下:

如: x=(x+1-getmy_1())*getmy_1();


或把 for(i=0;i<=count-1;i++)
改为: for(i=getmy_0();i<=count-getmy_1();i++)

抑或是:

指针 p++;可以改为: p=p+getmy_1();


或者:给函数传递变量时,传递方在 变量上+F1(ID), 被调用的函数在 变量上--GET_IDX():

比如本来是
void f1(){
int i,j;
....
j=f2(i);
}

int f2(i){
return i*2;
}
修改为:
void f1(){
int i;
....
j=f2(i+F1(ID));
}

int f2(i){
return (i-GET_IDX())*2;
}


如程序被非法复制:从ID无法得到IDX,那么IDX和F1(ID)不相等,

那么getmy_0不再是0,getmy_1不再是1,


程序将出现什么结果,谁都无法预料了。

---------------------------------------------------------
特点: 由于整个程序的加密,采用了“运算加密”的思路, 而非判断加密, 又没有用到任何一行 if判断,让解密者去想破脑袋吧。

即使猜测到有可能是这种加密思路,但是程序并不是基于if判断跳转,加密的作用自然分布在程序的各个地方,怎么去改,也很伤脑筋了。
直接修改getmy_1和getmy_0,这个首先是得分析出加密思路时才能作出的。

另外修改getmy_1和getmy_0只是干掉简单的部分。

还有一些是很难干掉的:

给函数传递变量时,传递方在 变量上+F1(ID), 被调用的函数在 变量上--GET_IDX():

比如本来是
void f1(){
int i,j;
....
j=f2(i);
}

int f2(i){
return i*2;
}
修改为:
void f1(){
int i;
....
j=f2(i+F1(ID));
}

int f2(i){
return (i-GET_IDX())*2;
}

另外,包括一些全局部变量的处理,可以在一些函数里面加上F1(ID);
在;另外一些地方进行-GET_IDX()的操作,并不会将代码简单集中放到一点的。

当然,如果精准的理解了整个程序的加密思路来说,这个也可以花时间干掉,不过这种加密方式本身目前是很少有人用的。

总之这种加密强度远高于简单的if比较方式。这个是一个新的基本思路,我举的例子只是一些简单的例子,完全可以自己做得更加灵活。

 

F1当然是一样的啊。只是ID不同。


顺便回复上楼,我有个前提: 只要单片机具有真正唯一ID,这个意思包含: 单片的ID不可以复制。

你说那个地方只是怎么去拷贝程序出来, 如果单片机具有真正唯一ID, 拷贝程序是没有用的。

大家先别拍砖头,思路很不错。从复杂度上已经增加到了一定程度。
建议做成强制in-line,否则对破解人来说太明显……因为大量的逻辑都指向某一个或某两个函数……
别低估干这行的智商——所谓没有金刚钻,不揽瓷器活。另外,用减法做比较也是业内常识……其它还有用异或结果是否为0……这些都是常见的特征……
对, inline!好思路, 必须的!

代码尺寸就上去了哦~ 执行效率也随之受到影响……不过如果有内部的什么1~4个周期的硬件CRC之类,就可以
解决效率问题,并且彻底把算法隐藏好……问题是……这个CRC硬件最好是不公开的才行……有一些芯片还有一些特殊矩阵转置(permutation)外设——也都没有对外公开……

隐藏加密算法的加密应用范围受到影响,因为用的人多了,自然就公开了,公开加密算法,没有密钥但依然很难解密的才有生命力,楼主这种思路是能够增加破解的困难,不过只能给盗版者加工资。当然有些小产品,利润和市场本来不大,盗版的成本太高也的确能保护可怜的程序员

所有的单机程序都是可以破解的,真正要保护自己的成果其实并不是通过加密,而是通过网络服务,这就像杀毒软件,只要联上网,主动权永远掌握在自己手中,这样的软件根本就永不着加密。就像微软的WINXP,再怎么加密也会被破解,但是只要联网,就可以黑你屏,就像单机游戏,今天做出来,明天就被破解,可是网络游戏,你见过破解的吗?除非入侵服务器,只要一入侵就被发现。所以单片机要想完全保护产权,就要提供网络化服务。

首先不要忙着拍砖,我来整理一下思路。利用全球唯一ID(每颗MCU都有一个唯一ID)的加密精髓在于防止程序轻易读出的情形,甚至HEX ROM根本无需加密,和破解读出HEX code的难易程度没有关系。实际上只需要两步:
1.自己想一个认为非常好的算法,利用MCU的GUID生成另外一个ID(可变长),再自己设计一个下载器(加密算法也在里边)烧录到EEPROM或Program ROM里边。保管好烧录器,不要外泄。你的烧录器就是一个加密工具!
2.在你的程序当中分布式的对用烧录器烧进去的加密后ID解密。这个比较重要,因为解密代码写的过于集中便于反汇编分析。比如不要解密后不正确不要进入死循环,不要立刻封杀所以功能,如果是盗版你故意给他几个致命BUG,让他抄袭后生产退货,损失更大。加密的结果就是烧录到每个MCU的HEXCODE是不相同的,即使读出了一个MCU的HEXCODE,烧到另外的MCU是不能通过解密算法验证的。唯一的解密的方法是去分析你得HEXCODE,分析出加密算法,破解者再设计出和你一样的烧录器!总之,这个方法只能对比较大的Program ROM有效果,如果是小的MCU,比如只有1KB ROM就很难做好,毕竟代码少,容易分析。说实话,如果有这样的功底的工程师去反汇编你的代码,说不定他就正向设计来得更快!这只是防盗防火防小人而已。 

用simlator去跟踪程序。然后找到GUID。替换掉即可。

STM32的UID有一部分是说明这个片子在晶圆的XY坐标位置的,一个晶圆上面所有的片子UID都不一样,至于不同晶圆的UID如何实现不同我就不知道了。。在晶圆上实现个唯一ID又难了?激光几闪,随机割断96个硅片的导线就获得了96bit的唯一ID了------------------------

楼主这个加密方法确实不错,不过前提是inline的方式,否则频繁调用某个函数很快就会被发现,另外加密后的IDX最好在启动时就读取到RAM中,否则频繁读取某个FLASH或EEPROM位置也很容易被发现,最后,还需要选用解密成本较高的单片机,如最近一个朋友想解密一款NEC的单片机,读出ROM的费用就需要近20万。
另外楼上说这个方法简单的,只是因为你已经看到了楼主的加密思路,如果现在是先给个用这种方法加密的固件出来,我想就不会有人轻易下结论了。如果是inline函数并上去的话,那么有个小问题就是代码量会超大。

楼主要研究软件的加密算法,建议先去学习一下现在windows下一般应用软件加壳的各种原理,唯一ID在这个领域是完全不新鲜的一个东西,最常见的就是软件根据CPU、硬盘或网卡的MAC来生成一个所谓硬件ID让用户注册。
而算法加密更是五花八门,除了加密条件判断外,还有代码的动态解码,就是用正确的KEY来解密函数A的代码,再跳过去执行,下次解码函数B时又会覆盖函数A的空间等等。
还有虚拟机加密,把一段x86代码转换为MIPS代码,在虚拟机中运行,这样如果破解不知道虚拟机模拟的是哪种汇编指令的话,反编译就会很累,代价就是运行速度下降。

适合有很大rom的mcu 可以加入一些垃圾代码。读取硬件id或软件id的这两个点是爆破的主要地方。例如固件整体验证的就是硬件id, 就算自己编写编程器变换固件内的其它key位置等, 整个算法验证的还是当前的mcu的硬件id是不是与这个固件匹配只要找到读取这个id的地方补丁一下就完了。这个其实就类似与pc机上绑定机器的软件的加密时一样的。

你的方法必须保证你读唯一ID的行为不被破解者看出。像STM32的独立ID在某个固定地址,那么只要找出访问那个地址的语句就可以了。

现在有不少量产编程器都支持根据唯一ID变换一些数据写入指定地址,甚至支持自己编写变换插件,每个单片机的程序都不一样是完全可以做到的。

你算法设计的越复杂,如果不是用来直接保护你自己的利益,那么就是为他们谋福利了。

什么坚不可摧。专业的加密芯片都可以摆平。何况这玩意儿? 

关键字:单片机  唯一ID  加密 引用地址:只要单片机具有真正唯一ID,就可以让加密坚不可摧

上一篇:STM8S/32的读保护
下一篇:KEIL C语言常用问题汇总

推荐阅读最新更新时间:2024-03-16 14:36

基于单片机PIC16F74的电动按摩椅的研制
本文介绍了一款采用PIC16F74单片机作为微处理芯片的电动按摩椅控制系统,具体包括有系统的组成和功能介绍、硬件电路的设计、软件功能实现以及抗干扰措施。   1:引言   随着我国经济的迅速发展和人们生活水平的不断提高,按摩椅等保健产品越来越受到欢迎。目前,在电动按摩椅市场上,进口、合资以及国产产品并存。相对而言,进口产品功能强大、按摩方式丰富、外观优美,但同时其价格也非常昂贵。而国内产品功能较简单,产品知名度也相对较低,但是其价格比较低廉。本文主要介绍了一款自主研发的中档电动按摩椅。该产品既有功能比较强大、按摩方式比较丰富、结构简单、外观优美、控制方式简单灵活,产品容易升级的特点,同时其价格却只有国外同等产品的一半。
[单片机]
基于<font color='red'>单片机</font>PIC16F74的电动按摩椅的研制
采用STM32 单片机的太阳能LED街灯解决方案
  随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。   本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户
[电源管理]
采用STM32 <font color='red'>单片机</font>的太阳能LED街灯解决方案
采用stc89c52单片机的红外学习型遥控器汇编代码
很详细的红外学习型遥控器,储存在24c64中的汇编子程序,在你自己的设计中只要修改一下IO调用它就可以了,是本人的工程验证能学习市面常用的绝大部分红外线遥控器 用的是stc89c52单片机,下面是汇编代码: ;********************************** ;---------------------AT24C64 CODE------------------------- ;========================================================== ICSTART: ;I2C 开始 SETB SDA NOP NOP NO
[单片机]
单片机控制实时时钟设计
引言 X1226具有时钟和日历的功能,时钟依赖时、分、秒寄存器来跟踪,日历依赖日期、星期、月和年寄存器来跟踪,日历可正确显示至2099年,并具有自动闰年修正功能。拥有强大的双报警功能,能够被设置到任何时钟/日历值上,精确度可到1秒。可用软件设置1Hz、4096Hz或32768Hz中任意一个频率输出。 X1226提供一个备份电源输入脚VBACK,允许器件用电池或大容量电容进行备份供电。采用电容供电时,用一个硅或肖特基二极管连接到Vcc和充电电容的两端,充电电容连接到Vback管脚,注意不能使用二极管对电池充电(特别是锂离子电池)。切换到电池供电的条件是Vcc=Vback-0.1V,正常操作期间,供电电压Vcc必须高于电池电
[单片机]
<font color='red'>单片机</font>控制实时时钟设计
单片机设计便携式医用自动输液器
1 引言 对于需要自助式护理的病人来说,尤其是由于手术后、晚期癌症、分娩等原因所导致的慢性疼痛的病人,往往需要一种可以由病人自己操作、自动定时、定量向病人进行输液的智能型自动输液器,以达到治疗和镇痛的目的。为此,笔者设计了一种便携式医用自动输液器,该仪器采用电池作为供电电源,并具有功耗小、体积小、重量轻等特点,可满足便携式需要。此外,该仪器使用安全可靠、计量准确、自动化程度高,可适应现代医学发展的要求。该自动输液器的主要功能如下: (1)可根据要求设定滴数、输液总量及药液总量等参数。 (2)随时可改变原设定参数,并可以在运行时随时暂停输液。 (3)不同的使用者可以有自己的一套运行参数,并可通过密码进入自己的设定环境。 (
[单片机]
用<font color='red'>单片机</font>设计便携式医用自动输液器
基于单片机DHT22温湿度LabView上位机监控系统设计
一、系统方案 本设计采用AT89C52单片机作为主控制器,液晶1602显示温湿度,LabView上位机通信,上位机显示温度,同时上位机可以设置温度上下限,当测量温度低于或高于上限,温度报警,上位机可以控制下位机加热设备启动与关闭,实现上位机和下位机的交换数据。 二、硬件设计 原理图如下: 三、单片机软件设计 1、单片机代码主要是串口初始化、串口中断服务程序。首先是串口初始化: void uart_init() { TMOD |= 0x20;//定时器1,工作模式2 8位自动重装 TH1 = 0xfd; TL1 = 0xfd;//设置比特率9600 SM0 = 0; SM1 = 1;//串口工作方式1,8位UART波特率可变
[单片机]
基于<font color='red'>单片机</font>DHT22温湿度LabView上位机监控系统设计
AVR单片机学习按键与数码管的程序设计
简介:按键与数码管的程序设计 AVR IO口的输入模式与上拉电阻 选择结构语句与按键的查询方式程序设计 数码管基本原理 扫描方式显示多位数码管 一、输入状态IO寄存器设置 1、DDRx 某一位置0,相应位的IO口被设置为输入 2、PORTx某一位置1,使能对应IO口相应位的上拉电阻 3、PINx的对应位是输入的数据,0或1 选择结构语句 一、关系运算符和关系表达式 小于 小于等于 = 大于 大于或等于== 不等于!= 二、逻辑运算符和逻辑表达式 逻辑与&&逻辑或||逻辑非! 三、if 语句结构 if(表达式1)语句1 else if(表达式2)语句2 else 语句3 四
[单片机]
AVR<font color='red'>单片机</font>学习按键与数码管的程序设计
以80C51单片机为例讲述单片机如何运行
前言 要想理解单片机是如何运行程序的,首先需要了解单片机的组成。本文以80C51单片机为例,给大家讲一讲程序在单片机中是如何运行的。 单片机的组成 8051单片机的内部硬件结构包括: 中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。 存储器:8051单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。 定时器/计数器(T/C):8051单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式
[单片机]
以80C51<font color='red'>单片机</font>为例讲述<font color='red'>单片机</font>如何运行
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved