第一环: 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判断,让解密者去想破脑袋吧。 看了这篇文章,我也对加密有了形式上的了解,让没有一点思路的人有点思路,菜鸟片,大神可以提供更多的方案供大家交流学习。 |
单片机加密初级
最新推荐文章于 2023-06-01 10:18:15 发布