搜索
bottom↓
12
返回列表 发新帖
楼主: nilxy

数据的加密传输——单片机上实现TEA加密解密算法

  [复制链接]

出0入0汤圆

发表于 2011-8-13 10:45:33 | 显示全部楼层
我要哭了,我用MCU加密然后在MFC中解密,开始试了下加密解密在MCU中处理完全正确,在PC上加密解密也正确。可是我在MCU中加密,然后在PC上解密就不行了,后来发现MCU采用了大端模式,而MFC是小端模式,这个问题还待解决呢。哪位高手看有没有什么方法,我现在打算使用htonl把PC上的v【0】都转换一次

出0入0汤圆

发表于 2011-9-24 15:16:04 | 显示全部楼层
碰到和楼上一样的问题了,请问你是怎么解决的?
htonl指令用哪?

出0入0汤圆

发表于 2011-10-6 20:15:21 | 显示全部楼层
不错!我去试试

出0入0汤圆

发表于 2011-10-6 21:00:52 | 显示全部楼层
mark之

出0入0汤圆

发表于 2011-10-7 10:22:20 | 显示全部楼层
我们的产品09年就用上了,对于内存较小、速度慢的单片机的确运算速度挺快的。
不过相比大名顶顶的AES128/256加密程度还是不行,毕竟那个是USA的标准啊。
国产的SM系列算法普通老百姓是用不起的,也不是给普通用户使用的除了SM4。

出0入0汤圆

发表于 2011-10-7 10:24:27 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2011-10-7 10:35:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-7 11:00:20 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2011-10-7 14:42:29 | 显示全部楼层
呵呵,我的产品还没用过加密

出0入0汤圆

发表于 2011-10-7 17:05:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-7 17:08:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-7 17:29:45 | 显示全部楼层
关注下

出0入0汤圆

发表于 2011-11-29 23:25:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-29 23:49:46 | 显示全部楼层
非常实用

出0入0汤圆

发表于 2011-11-30 01:03:07 | 显示全部楼层
果断马克,学习,虽然现在用不上

出0入0汤圆

发表于 2011-11-30 01:16:48 | 显示全部楼层
mark

出50入10汤圆

发表于 2011-11-30 10:31:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-30 10:47:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-30 11:16:20 | 显示全部楼层
mark

出0入17汤圆

发表于 2011-11-30 14:21:24 | 显示全部楼层
MARK先。

出0入22汤圆

发表于 2011-11-30 15:18:01 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-30 18:46:46 | 显示全部楼层
MARK

出0入0汤圆

发表于 2013-5-26 09:09:51 | 显示全部楼层
算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。s_looptime是不是指这个。

出0入0汤圆

发表于 2013-5-26 09:59:45 | 显示全部楼层
谢谢!收藏了

出0入0汤圆

发表于 2013-5-26 10:04:12 | 显示全部楼层
貌似不错的说。。。。。。。。

出0入0汤圆

发表于 2013-5-27 21:56:52 来自手机 | 显示全部楼层
强帖留名~o(∩_∩)o

出0入0汤圆

发表于 2013-5-28 17:25:04 | 显示全部楼层
not bad !!!!

出0入0汤圆

发表于 2013-5-28 17:44:29 | 显示全部楼层
学习了,虽然平时很少加密。

出0入0汤圆

发表于 2013-6-22 12:24:50 | 显示全部楼层
运算量还是大了,能否有高手再简化呢!
也不需要这么复杂加密算法吧,因为这个时候的瓶颈已经是Key的获得了。
获得Key相对更容易些了吧!所以运算负载这么大,就有些不值啦!

出0入0汤圆

发表于 2013-6-22 12:33:11 | 显示全部楼层
3Q~!辛苦了

出0入0汤圆

发表于 2013-8-12 16:30:42 | 显示全部楼层
标记一下,有空研究一下。

出200入0汤圆

发表于 2013-8-12 17:55:38 来自手机 | 显示全部楼层
好东东,学习

出0入8汤圆

发表于 2013-8-12 18:52:08 | 显示全部楼层
好东西,mark                          

出0入0汤圆

发表于 2013-8-14 15:37:02 | 显示全部楼层
不错,顶下,学习学习

出0入0汤圆

发表于 2013-9-28 02:01:38 | 显示全部楼层
感谢楼主   资料已下载并成功应用

出0入17汤圆

发表于 2013-9-28 08:53:34 | 显示全部楼层
mark 单片机通信加密

出0入0汤圆

发表于 2013-9-28 09:41:20 | 显示全部楼层
mark      

出0入0汤圆

发表于 2013-10-20 11:19:39 | 显示全部楼层
MARK一下

出0入0汤圆

发表于 2014-2-8 16:16:16 | 显示全部楼层
学习一下,单片机TEA加密方法

出0入0汤圆

发表于 2014-4-3 15:20:39 | 显示全部楼层
TEA 加密 MARK

出0入0汤圆

发表于 2014-4-23 00:40:53 | 显示全部楼层
不错哦.学习下

出0入0汤圆

发表于 2014-4-23 04:22:04 | 显示全部楼层
学习 强!

出0入0汤圆

发表于 2014-4-23 07:43:49 来自手机 | 显示全部楼层
ActiveAndy 发表于 2013-6-22 12:24
运算量还是大了,能否有高手再简化呢!
也不需要这么复杂加密算法吧,因为这个时候的瓶颈已经是Key的获得了 ...

你有找到更简洁的算法吗?

出0入0汤圆

发表于 2014-4-23 08:21:00 | 显示全部楼层
好贴,mark

出0入0汤圆

发表于 2014-7-26 19:29:38 | 显示全部楼层
Mark,以备使用!

出0入0汤圆

发表于 2014-7-26 20:31:37 | 显示全部楼层
mark,tea加密

出0入0汤圆

发表于 2014-7-26 21:56:56 | 显示全部楼层
mark.........

出0入0汤圆

发表于 2014-7-30 11:32:59 | 显示全部楼层
nilxy 发表于 2010-9-14 16:49
回复【39楼】Trylin
刚才测试了一下,如果加密数据的长度小于8,也就是 block_size 如果小于8,加密解密失 ...

楼主好,看了一下,如果升级程序最后一组数不足8字节(5字节)怎么办?填充到8字节再发么,那解密后这8字节如何知道那几个是有用的。

出0入0汤圆

发表于 2014-7-30 12:43:19 | 显示全部楼层
好东西啊,不错,不错,参考了!

出0入0汤圆

发表于 2014-8-12 13:32:49 | 显示全部楼层
大数据传输不太合适 还是影响速率

出0入0汤圆

发表于 2014-11-27 12:04:46 | 显示全部楼层

如果用了一个公布了的加密算法。那麽这个算法就不能用了

出0入0汤圆

发表于 2014-11-27 12:05:48 | 显示全部楼层

只要单片机具有真正唯一ID,就可以让加密坚不可摧(2013-08-12 15:45:23)
第一环:

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变换一些数据写入指定地址,甚至支持自己编写变换插件,每个单片机的程序都不一样是完全可以做到的。

出0入0汤圆

发表于 2020-9-1 10:50:52 | 显示全部楼层
zhifeng 发表于 2010-11-3 15:54
楼主的,就是xxtea

请问看哪里区分是xxtea还tea

出0入0汤圆

发表于 2020-9-1 20:21:37 | 显示全部楼层
这个加密有用,刚好有项目做通讯到时测试一下。

出0入0汤圆

发表于 2021-11-14 10:58:04 | 显示全部楼层
这个加密算法是否同一个数据每一次加密出来后都是不同的?有人运用过吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-6-26 01:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表