设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2184|回复: 2
收起左侧

基于STC系列单片机的获取芯片出厂序列号并计算CRC32码校验,可防止IC被非法解密复制

[复制链接]
发表于 2018-11-10 14:45:04 | 显示全部楼层 |阅读模式


  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define U8 unsigned char
  4. #define U16 unsigned int
  5. #define U32 unsigned long
  6. sbit led=P3^4;
  7. #define cptr_crc32 0x97DFFDBB        //序列号CRC32码(每个IC都不同,否则校验不通过)
  8. U8 code *cptr;         //序列号指针


  9. void delay25ms()                //@12MHz
  10. {
  11.         unsigned char i, j, k;

  12.         i = 2;
  13.         j = 36;
  14.         k = 206;
  15.         do
  16.         {
  17.                 do
  18.                 {
  19.                         while (--k);
  20.                 } while (--j);
  21.         } while (--i);
  22. }



  23. U32 code table[256]={ //CRC32的表(是固定的)
  24. 0,1996959894,-301047508,-1727442502,124634137,1886057615,-379345611,-1637575261,249268274,2044508324,-522852066,-1747789432,162941995,2125561021,-407360249,-1866523247,
  25. 498536548,1789927666,-205950648,-2067906082,450548861,1843258603,-187386543,-2083289657,325883990,1684777152,-43845254,-1973040660,335633487,1661365465,-99664541,-1928851979,
  26. 997073096,1281953886,-715111964,-1570279054,1006888145,1258607687,-770865667,-1526024853,901097722,1119000684,-608450090,-1396901568,853044451,1172266101,-589951537,-1412350631,
  27. 651767980,1373503546,-925412992,-1076862698,565507253,1454621731,-809855591,-1195530993,671266974,1594198024,-972236366,-1324619484,795835527,1483230225,-1050600021,-1234817731,
  28. 1994146192,31158534,-1731059524,-271249366,1907459465,112637215,-1614814043,-390540237,2013776290,251722036,-1777751922,-519137256,2137656763,141376813,-1855689577,-429695999,
  29. 1802195444,476864866,-2056965928,-228458418,1812370925,453092731,-2113342271,-183516073,1706088902,314042704,-1950435094,-54949764,1658658271,366619977,-1932296973,-69972891,
  30. 1303535960,984961486,-1547960204,-725929758,1256170817,1037604311,-1529756563,-740887301,1131014506,879679996,-1385723834,-631195440,1141124467,855842277,-1442165665,-586318647,
  31. 1342533948,654459306,-1106571248,-921952122,1466479909,544179635,-1184443383,-832445281,1591671054,702138776,-1328506846,-942167884,1504918807,783551873,-1212326853,-1061524307,
  32. -306674912,-1698712650,62317068,1957810842,-355121351,-1647151185,81470997,1943803523,-480048366,-1805370492,225274430,2053790376,-468791541,-1828061283,167816743,2097651377,
  33. -267414716,-2029476910,503444072,1762050814,-144550051,-2140837941,426522225,1852507879,-19653770,-1982649376,282753626,1742555852,-105259153,-1900089351,397917763,1622183637,
  34. -690576408,-1580100738,953729732,1340076626,-776247311,-1497606297,1068828381,1219638859,-670225446,-1358292148,906185462,1090812512,-547295293,-1469587627,829329135,1181335161,
  35. -882789492,-1134132454,628085408,1382605366,-871598187,-1156888829,570562233,1426400815,-977650754,-1296233688,733239954,1555261956,-1026031705,-1244606671,752459403,1541320221,
  36. -1687895376,-328994266,1969922972,40735498,-1677130071,-351390145,1913087877,83908371,-1782625662,-491226604,2075208622,213261112,-1831694693,-438977011,2094854071,198958881,
  37. -2032938284,-237706686,1759359992,534414190,-2118248755,-155638181,1873836001,414664567,-2012718362,-15766928,1711684554,285281116,-1889165569,-127750551,1634467795,376229701,
  38. -1609899400,-686959890,1308918612,956543938,-1486412191,-799009033,1231636301,1047427035,-1362007478,-640263460,1088359270,936918000,-1447252397,-558129467,1202900863,817233897,
  39. -1111625188,-893730166,1404277552,615818150,-1160759803,-841546093,1423857449,601450431,-1285129682,-1000256840,1567103746,711928724,-1274298825,-1022587231,1510334235,755167117,

  40. };

  41. void check_cptr(){                //上电校验序列号的CRC32码是否匹配
  42. U32 crc32=-1;
  43. U8 dat,j;
  44. cptr=0x0FF9;                //序列号ROM地址(不同型号的可能会有不同)
  45. for(j=0;j<7;j++){
  46.         dat=cptr[j];
  47.         dat ^= crc32;
  48.         crc32 >>=8;
  49.         crc32 &= 16777215;
  50.         crc32 ^= table[dat];
  51. }

  52.         if(~crc32 != cptr_crc32){        //校验不通过,LED闪烁

  53.                 while(1){
  54.                 delay25ms();
  55.                 led=!led;
  56.                 }
  57.         }


  58. }


  59. void main(){
  60. check_cptr();
  61. led=0;        //校验通过,LED常亮
  62.         while(1);

  63. }


复制代码

评分

1

查看全部评分

发表于 2018-11-11 10:52:29 | 显示全部楼层
最好用自己的算法
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-19 15:07 , Processed in 0.687039 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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