原创 关于CRC表及HotPower的CRC/PEC网上计算器用法简介

2009-2-28 06:47 5553 5 5 分类: MCU/ 嵌入式

出处:http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=3246132



quakegod 发表于 2009-2-28 04:35 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 一直想不明白的CRC校验算法问题


恕敝人少见多怪
偶一直觉得这个CRC算法里面有一个重大的BUG,
就是对一个全0值的数据段进行CRC最后等到的结果居然是0
得到了一个全0的数据包,
而这个全0的数据包恰恰是在出现错误的时候最容易出现的,
然而校验结果居然正确。
偶窃以为,应该在生成CRC后,加上一个类似55AA的数据,
这样既不破坏CRC的强壮,也能防止全0包的出现。

quakegod 发表于 2009-2-28 04:40 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: 再推导到其他校验算法


偶们常用的校验算法还有很多,
比如说常用的累加值校验算法,
这个算法也会产生同样的BUG,
有些是不能防全0数据,有些是不能防全1数据,
偶自己在做简单的累加和算法时,都会在累加数据上在加上一个固定值,
偶窃以为偶并没有改变算法本身的什么东东,只是改了一下表示方法,
不知道这种方法值不值得提倡。

这个问题偶想了好几年了,一直没好意思说出来。
今天斗胆发言,欢迎大家批评指正。


HotC51 发表于 2009-2-28 05:10 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

3楼: 我个人最喜欢数据包CRC后的结果再1次CRC后结果为0


简单地说,若数据包长8个字节,CRC8次后得到1结果。

若将此结果再进行1次CRC运算,则结果为0.

利用此现象,我们就可以不去比对CRC的合法性即可知道数据包的CRC是正确的。

楼主说“对一个全0值的数据段进行CRC最后等到的结果居然是0”。

我可以理解:对一个全0值的数据段长度-1进行CRC后的结果为0.

则再进行1次(此时到了数据段的最大长度),即对0再CRC(此时为0)结果也应该

为0.

故这不是什么"CRC重大的BUG".

即使其他演算方法,如求和,异或等都无法避免这种全零数据的问题。

crc hotpower


HotC51 发表于 2009-2-28 06:15 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

4楼: 关于CRC表及HotPower的CRC/PEC网上计算器用法简介


unsigned int crc_ta[256]={ /* CRC余式表 */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x 1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,

0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

HotPower的CRC/PEC网上计算器用法简介:
1.在右下角选择"16位左移"CRC运算方式。

  此时出现"初值=0",“权=0x0810”.

2.在输入键入4位所需的演算数字
  如: CRC16[0xff]=0x1ef0.
  在“输入处输入”:0x00ff 点击“计算”
  (实际是“加密”,俺没好意思写,怕“数学家”的砖头)
  这时:“输出”处显示:1EF0
同理:
  如: CRC16[0x01]=0x1021.(俺称之为1021法~~~)
  在“输入处输入”:0x0001 点击“计算”
  这时:“输出”处显示:1021
同理:
  如: CRC16[0x10]=0x1231.
  在“输入处输入”:0x0010 点击“计算”
  这时:“输出”处显示:1231

3.演算HotPower的CRC/PEC网上计算器的“还原”及解密过程

  菜农酷爱CRC算法,虽然搞不出为什么。一直迷恋了20年之久~~~
  当91年攻克了美国FLUK的64为CRC密码后,就琢磨着CRC是否“可逆”
  
  居然又被俺猜中,而且悟出了“权”,这样就得到了“初值”和“权”
  何为CRC的“密钥”。
  
  为了在网上让大家直接玩耍,在俺做“JavaScript语言菜鸟”时,菜鸟
  的唯一“作品”就是这个程序~~~

  “还原”及解密步骤:
   CRC16[0xFE]=0x0ED1
   
   1)在“输出”键入"0ED1",注意此时“初值”="0000",“权”="0810"
   2)点击“还原”,“输出”得到“00FE”
     这样即可验证了CRC16[0xFE]=0x0ED1,
     即:
     “初值”="0000",“权”="0810",“明文”="00FE"时,
     “密文”="0ED1"
     反之:
     “初值”="0000",“权”="0810",“密文”="0ED1"时,
     “明文”="00FE"
     
   3)变换“密钥”
     将“初值”改为“0250”~~~俺喜欢这个
     再“权”也改为“0250”~~~2个也有意思~~~
     “输出”即“密文”不变="0ED1"。
     “还原后”则“输入”即“明文”就为“7FE1”~~~
     
     将“初值”改回"0000",“权”改回"0810",
    “还原后”则“输入”即“明文”就为“00FE”~~~

   4)关于“权”“同方向加权”的重码问题
     现在可以看到,当“权”不变时,看不出问题,但是。
     当选择“16位左移”,则“同方向加权”即“左面最高位置1”
     
     即将“权”变为"8810"时,可以会惊奇地发现:
    “计算”“还原”结果都不变!!!~~~

   这个菜农做了8、16、32、64的“左移”和“右移”的CRC运算,
   可惜没做12、24、48的,至今很是“后悔”~~~

   但是“菜鸟的”“热情”已过,打死俺也不会再做了~~~
   因为只有一个字:“眼晕”~~~


哈哈~~~大家都为CRC战斗吧~~~俺只关心能有一位数学家为菜农

验证俺一直不解的“CRC可逆过程”~~~

也想知道数学界对俺一个“知识老农民”无知的“数学脑浆”“琢磨”
出来的“CRC密码”的“强度”有多高~~~


俺手里还有2个“级别高的CRC滚动密码的”网上计算器版本~~~
  

HotPower的CRC/PEC网上计算器



签名:


●█〓██▄▄▄▄▄▄ ●●●●●●→ ''''╭WWWW╮
▄▅██████▅▄▃▂ 传播非典灌水四方 ( ●_●)
███天█马█行█空████ '''',,,;,;,;'''/▇\''
◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ 群魔乱舞见阳光/MMMM\
工程师的收藏夹
200773055547196.gif




HotC51共产儿童团

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条