原创 crc系列瞎谈

2007-4-13 23:42 4869 6 6 分类: 软件与OS


crc系列瞎谈
雁塔菜农 发表于 2005-5-31 0:51:00

crc系列瞎谈-(精)(2298字)hotpower2004-9-5 13:12:31[128次]

大家都用标准的CRC16(左移),我偏要右移才开心
HotPower 发表于 2004-7-17 15:25 侃单片机 ←返回版面   举报该贴

unsigned int crc16r(unsigned int crcword, unsigned int crc)
{
unsigned char i;
  for(i = 0; i < 16; i++){
    if(((crc ^ crcword ) & 0x0001) == 0) crc >>= 1;
    else{
      crc ^= 0x810;//0x0810;//CRC=X16+X12+X5+1
      crc >>= 1;
      crc |= 0x8000;
    }
    crcword >>= 1;
  }
  return crc;
}



本程序可用工具
http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=900064
http://www.21icbbs.com/club/bbs/showEssence.asp?id=4611&page=1
http://www.21icbbs.com/club/bbs/showEssence.asp?id=4611&page=2
进行校验




系统注:本文被午夜听风加精.

相关帖子>>>:
note.gifcrc系列瞎谈-(精)

  • 64.GIF“三角恋爱”之金屋藏娇(1864字)hotpower[29次]2004-9-5 13:15:50
    “三角恋爱”之金屋藏娇
    HotPower 发表于 2004-5-8 01:09 侃单片机 ←返回版面   举报该贴

    在本主题的前2个姊妹篇中,可以很清楚地看到:

    CRC密码主要是由初值、权、原码三个基本“元素”构成,而“群魔乱舞”又增加了运算方
    向。
    即:  CRC密码 = f(原码,初值,权,方向)= f(原码,密钥)
          CRC原码 = F(密码,初值,权,方向)= F(密码,密钥)
    注:f()与F()互为反函数。

    所以,CRC自带“天生秘籍”——密钥(初值,权,方向)
    这真是“大自然带给CRC密码学最好的礼物”,一般函数很难找到。

    三角密码主要根据特殊直角三角形得出,其特点是可以产生“裂变”,即单字节数可产生
    256个
    不重复的双字节数。
    若将其“聚合”就会演变为单向函数,这主要是保护密钥不被反推。
    这样,运算的中间结果就可被“金屋藏娇”。

    例:(只举基本原理)

    设密钥为1234H.
    分别对12H和34H查《三角恋爱密码表》得出806EH和82F4H.(注意:806EH<82F4H."<"就隐藏
    了左移方向)
    再将806EH和82F4H异或得029AH.(02H可做CRC初值,9AH可做CRC权)

    设密钥为3412H.
    分别对34H和12H查《三角恋爱密码表》得出82F4H和806EH.(注意:82F4H>806EH.">"就隐藏
    了右移方向)
    再将82F4H和806EH异或得029AH.(02H可做CRC初值,9AH可做CRC权)

    故可看出,1234H和3412H由于异或关系,其结果(初值,权)是一样的。(单向函数——给敌
    人“挖坑”)
    但内藏的“娇娃”——CRC密码的运算方向是不一样的。
    方向的不同就意味着运算方法的不同!!!(这正是CRC密码的最大亮点和隐蔽之处)
    若运算方法都不知还能谈什么“解密”吗?


    当然,这里我只举了基本原理,应用肯定更为复杂。。。
    而且,“金屋”里不止藏了“方向”这一个娇娃。。。





  • note.gif《三角恋爱密码表》及三角变换 (40204字)hotpower[27次]2004-9-5 13:17:16
    《三角恋爱密码表》及三角变换
    HotPower 发表于 2004-5-1 19:26 侃单片机 ←返回版面   举报该贴

    写真集中的《三角恋爱》是《深山探宝》和《洞中探密》的“姊妹篇”。

    《三角恋爱》主要由海誓山盟、金屋藏娇、过河拆桥、爱情结晶、破镜重圆和子孙满堂等部
    分组成。

    先给个《三角恋爱密码表》吧


          00    01    02    03    04    05    06    07    08    09    0A    0B    
    0C    0D    0E    0F  
      00 8002  0003  8006  0008  800C  000F  8014  0018  801E  0023  802A  0030  
    8038  003F  8048  0050  
      01 805A  0063  806E  0078  8084  008F  809C  00A8  80B6  00C3  80D2  00E0  
    80F0  00FF  8110  0120  
      02 8132  0143  8156  0168  817C  018F  81A4  01B8  81CE  01E3  81FA  0210  
    8228  023F  8258  0270  
      03 828A  02A3  82BE  02D8  82F4  030F  832C  0348  8366  0383  83A2  03C0  
    83E0  03FF  8420  0440  
      04 8462  0483  84A6  04C8  84EC  050F  8534  0558  857E  05A3  85CA  05F0  
    8618  063F  8668  0690  
      05 86BA  06E3  870E  0738  8764  078F  87BC  07E8  8816  0843  8872  08A0  
    88D0  08FF  8930  0960  
      06 8992  09C3  89F6  0A28  8A5C  0A8F  8AC4  0AF8  8B2E  0B63  8B9A  0BD0  
    8C08  0C3F  8C78  0CB0  
      07 8CEA  0D23  8D5E  0D98  8DD4  0E0F  8E4C  0E88  8EC6  0F03  8F42  0F80  
    8FC0  0FFF  9040  1080  
      08 90C2  1103  9146  1188  91CC  120F  9254  1298  92DE  1323  936A  13B0  
    93F8  143F  9488  14D0  
      09 951A  1563  95AE  15F8  9644  168F  96DC  1728  9776  17C3  9812  1860  
    98B0  18FF  9950  19A0  
      0A 99F2  1A43  9A96  1AE8  9B3C  1B8F  9BE4  1C38  9C8E  1CE3  9D3A  1D90  
    9DE8  1E3F  9E98  1EF0  
      0B 9F4A  1FA3  9FFE  2058  A0B4  210F  A16C  21C8  A226  2283  A2E2  2340  
    A3A0  23FF  A460  24C0  
      0C A522  2583  A5E6  2648  A6AC  270F  A774  27D8  A83E  28A3  A90A  2970  
    A9D8  2A3F  AAA8  2B10  
      0D AB7A  2BE3  AC4E  2CB8  AD24  2D8F  ADFC  2E68  AED6  2F43  AFB2  3020  
    B090  30FF  B170  31E0  
      0E B252  32C3  B336  33A8  B41C  348F  B504  3578  B5EE  3663  B6DA  3750  
    B7C8  383F  B8B8  3930  
      0F B9AA  3A23  BA9E  3B18  BB94  3C0F  BC8C  3D08  BD86  3E03  BE82  3F00  
    BF80  3FFF  C080  4100  


    注:这个表可不是我用手编辑的,它可是由三角密码算法自动生成的。所以,此表决无“笔
    误”之嫌!!!

    三角变换:
    这是一种“单向函数”,主要是加密密钥之用。
    例:  8位密钥为18H时
    则18H经过三角变换即查《三角恋爱密码表》或用三角变换公式会得到80B6H.
    再将其高8位与低8位进行异或运算“压缩”成36H.
    请看下表:

          00    01    02    03    04    05    06    07    08    09    0A    0B    
    0C    0D    0E    0F  
      00  82    03    86    08    8C    0F    94    18    9E    23    AA    30    
    B8    3F    C8    50   
      01  DA    63    EE    78    04    8F    1C    A8    36    C3    52    E0    
    70    FF    91    21   
      02  B3    42    D7    69    FD    8E    25    B9    4F    E2    7B    12    
    AA    3D    DA    72   
      03  08    A1    3C    DA    76    0C    AF    4B    E5    80    21    C3    
    63    FC    A4    44   
      04  E6    87    22    CC    68    0A    B1    5D    FB    A6    4F    F5    
    9E    39    EE    96   
      05  3C    E5    89    3F    E3    88    3B    EF    9E    4B    FA    A8    
    58    F7    B9    69   
      06  1B    CA    7F    22    D6    85    4E    F2    A5    68    11    DB    
    84    33    F4    BC   
      07  66    2E    D3    95    59    01    C2    86    48    0C    CD    8F    
    4F    F0    D0    90   
      08  52    12    D7    99    5D    1D    C6    8A    4C    30    F9    A3    
    6B    2B    1C    C4   
      09  8F    76    3B    ED    D2    99    4A    3F    E1    D4    8A    78    
    28    E7    C9    B9   
      0A  6B    59    0C    F2    A7    94    7F    24    12    FF    A7    8D    
    75    21    06    EE   
      0B  D5    BC    61    78    14    2E    CD    E9    84    A1    40    63    
    03    DC    C4    E4   
      0C  87    A6    43    6E    0A    28    D3    FF    96    8B    A3    59    
    71    15    02    3B   
      0D  D1    C8    E2    94    89    A2    51    46    78    6C    1D    10    
    20    CF    C1    D1   
      0E  E0    F1    85    9B    A8    BB    B1    4D    5B    55    6C    67    
    7F    07    00    09   
      0F  13    19    24    23    2F    33    30    35    3B    3D    3C    3F    
    3F    C0    40    41   

    若36H再与原码18H进行异或运算后,会得到2EH
    请看下表:

          00    01    02    03    04    05    06    07    08    09    0A    0B    
    0C    0D    0E    0F  
      00  82    02    84    0B    88    0A    92    1F    96    2A    A0    3B    
    B4    32    C6    5F   
      01  CA    72    FC    6B    10    9A    0A    BF    2E    DA    48    FB    
    6C    E2    8F    3E   
      02  93    63    F5    4A    D9    AB    03    9E    67    CB    51    39    
    86    10    F4    5D   
      03  38    90    0E    E9    42    39    99    7C    DD    B9    1B    F8    
    5F    C1    9A    7B   
      04  A6    C6    60    8F    2C    4F    F7    1A    B3    EF    05    BE    
    D2    74    A0    D9   
      05  6C    B4    DB    6C    B7    DD    6D    B8    C6    12    A0    F3    
    04    AA    E7    36   
      06  7B    AB    1D    41    B2    E0    28    95    CD    01    7B    B0    
    E8    5E    9A    D3   
      07  16    5F    A1    E6    2D    74    B4    F1    30    75    B7    F4    
    33    8D    AE    EF   
      08  D2    93    55    1A    D9    98    40    0D    C4    B9    73    28    
    E7    A6    92    4B   
      09  1F    E7    A9    7E    46    0C    DC    A8    79    4D    10    E3    
    B4    7A    57    26   
      0A  CB    F8    AE    51    03    31    D9    83    BA    56    0D    26    
    D9    8C    A8    41   
      0B  65    0D    D3    CB    A0    9B    7B    5E    3C    18    FA    D8    
    BF    61    7A    5B   
      0C  47    67    81    AD    CE    ED    15    38    5E    42    69    92    
    BD    D8    CC    F4   
      0D  01    19    30    47    5D    77    87    91    A0    B5    C7    CB    
    FC    12    1F    0E   
      0E  00    10    67    78    4C    5E    57    AA    B3    BC    86    8C    
    93    EA    EE    E6   
      0F  E3    E8    D6    D0    DB    C6    C6    C2    C3    C4    C6    C4    
    C3    3D    BE    BE   



  • note.gifcrc8r(),crc16r()(2140字)hotpower[33次]2004-9-5 13:19:33
    unsigned char crc8r(unsigned char crcbyte)
    {
    unsigned char i,crc;
      crc = 0;
      for(i = 0; i < 8; i++) {
        if(((crc ^ crcbyte) & 0x01) == 0) crc >>= 1;
        else{
          crc ^= 0x18;//0x18;//CRC=X8+X5+X4+1
          crc >>= 1;
          crc |= 0x80;
        }
        crcbyte >>= 1;
      }
      return crc;
    }

    unsigned int crc16r(unsigned int crcword, unsigned int crc)
    {
    unsigned char i;
      for(i = 0; i < 16; i++){
        if(((crc ^ crcword ) & 0x0001) == 0) crc >>= 1;
        else{
          crc ^= 0x810;//0x0810;//CRC=X16+X12+X5+1
          crc >>= 1;
          crc |= 0x8000;
        }
        crcword >>= 1;
      }
      return crc;
    }


  • note.gifcrc校验51汇编实验源程序 (32512字)hotpower[20次]2004-9-5 13:21:55
    crc校验51实验源程序
    HotPower 发表于 2004-4-27 09:35 侃单片机 ←返回版面   举报该贴

    CRC     EQU   30H
    CRCH    EQU   31H
    CRCL    EQU   32H
    DATABIT BIT   P1.0
            ORG   0000H
    START:
            LJMP  MAIN
    MAIN:
            MOV   SP,#40H
    ;8位静态字节循环冗余码校验程序
            MOV   CRC,#00H
            MOV   B,#7;7字节CRC循环冗余码校验
            MOV   R0,#80H
            MOV   R1,#88H
            MOV   DPTR,#TABLE_DEMO
    ;        MOV   DPTR,#TABLE_1400000594AE6801
    TABLE_LOOP:
            MOV   A,B
            MOVC  A,@A+DPTR
            MOV   @R0,A
            INC   R0
            LCALL DO_CRC
            MOV   @R1,CRC
            INC   R1
            DJNZ  B,TABLE_LOOP
            MOV   A,B
            MOVC  A,@A+DPTR
            MOV   @R0,A
            MOV   @R1,CRC
    ;发送方8位动态循环冗余码校验程序
            MOV   CRC,#00H
            MOV   B,#7;7*8=56位CRC循环冗余码校验
            MOV   R0,#90H
            MOV   R1,#98H
            MOV   DPTR,#TABLE_96000005949C6F01
    TABLE_NEXT1:
            MOV   A,B
            MOVC  A,@A+DPTR
            MOV   @R0,A
            INC   R0
            MOV   R7,#08H
    TABLE_REP1:
            RRC   A
            MOV   DATABIT,C;发送1位数据
            LCALL BITCRC;发送1位动态数据循环冗余码校验
            DJNZ  R7,TABLE_REP1
            MOV   @R1,CRC
            INC   R1
            DJNZ  B,TABLE_NEXT1
            MOV   A,B
            MOVC  A,@A+DPTR
            MOV   @R0,A
            MOV   @R1,CRC
    ;接收方8位动态循环冗余码校验程序
            MOV   CRC,#00H
            MOV   B,#7;7*8=56位CRC循环冗余码校验
            MOV   R0,#0A0H
            MOV   R1,#0A8H
            MOV   DPTR,#TABLE_5800000599602701
    TABLE_NEXT2:
            MOV   A,B
            MOVC  A,@A+DPTR
            MOV   @R0,A
            INC   R0
            MOV   R7,#08H
    TABLE_REP2:
            MOV   C,ACC.0
            MOV   DATABIT,C
            MOV   C,DATABIT;接收1位数据
            LCALL BITCRC;接收1位动态数据循环冗余码校验
            RRC   A
            DJNZ  R7,TABLE_REP2
            MOV   @R1,CRC
            INC   R1
            DJNZ  B,TABLE_NEXT2
            MOV   A,B
            MOVC  A,@A+DPTR
            MOV   @R0,A
            MOV   @R1,CRC
    ;发送方16位动态循环冗余码校验程序
            MOV   CRCL,#00H
            MOV   CRCH,#00H
            MOV   B,#8;6*8=48位CRC循环冗余码校验
            MOV   R0,#0C0H
            MOV   R1,#0D0H
            MOV   DPTR,#TABLE_WORDCRC0;
    TABLE_NEXT3:
            CLR   A
            MOVC  A,@A+DPTR
            INC   DPTR
            MOV   @R0,A
            INC   R0
            INC   R0
            MOV   R7,#08H
    TABLE_REP3:
            RRC   A
            MOV   DATABIT,C;发送1位数据
            LCALL WORDCRC;发送1位动态数据循环冗余码校验?
            DJNZ  R7,TABLE_REP3
            MOV   @R1,CRCH
            INC   R1
            MOV   @R1,CRCL
            INC   R1
            DJNZ  B,TABLE_NEXT3
    ;发送方16位动态循环冗余码校验程序
            MOV   CRCL,#00H
            MOV   CRCH,#00H
            MOV   B,#8;6*8=48位CRC循环冗余码校验
            MOV   R0,#0E0H
            MOV   R1,#0F0H
            MOV   DPTR,#TABLE_WORDCRC1;
    TABLE_NEXT4:
            CLR   A
            MOVC  A,@A+DPTR
            INC   DPTR
            MOV   @R0,A
            INC   R0
            INC   R0
            MOV   R7,#08H
    TABLE_REP4:
            RRC   A
            MOV   DATABIT,C;发送1位数据
            LCALL WORDCRC;发送1位动态数据循环冗余码校验
            DJNZ  R7,TABLE_REP4
            MOV   @R1,CRCH
            INC   R1
            MOV   @R1,CRCL
            INC   R1
            DJNZ  B,TABLE_NEXT4
            SJMP  $
    ;8位静态字节循环冗余码校验程序
    DO_CRC:
            PUSH  ACC
            PUSH  B
            PUSH  ACC
            MOV   B,#8
    CRC_LOOP:
            XRL   A,CRC
            RRC   A
            MOV   A,CRC
            JNC   ZERO
            XRL   A,#18H;CRC=X8+X5+X4+1
    ZERO:
            RRC   A
            MOV   CRC,A
            POP   ACC
            RR    A
            PUSH  ACC
            DJNZ  B,CRC_LOOP
            POP   ACC
            POP   B
            POP   ACC
            RET
    ;8位动态按位循环冗余码校验程序
    BITCRC:
    ;1位需21uS
            PUSH  PSW
    ;1位需17uS
    ;56位需56*17=952uS(1112uS)
            PUSH  ACC
            RLC   A
            XRL   A,CRC
            RRC   A
            MOV   A,CRC
            JNC   BITCRC_ZERO
            XRL   A,#18H;CRC=X8+X5+X4+1
    BITCRC_ZERO:
            RRC   A
            MOV   CRC,A
            POP   ACC
            POP   PSW
            RET
    ;16位动态按位循环冗余码校验程序
    WORDCRC:
    ;1位需21uS
            PUSH  PSW
    ;1位需17uS
    ;56位需56*17=952uS(1112uS)
            PUSH  ACC
            RLC   A
            XRL   A,CRCL
            RRC   A
            MOV   F0,C
            MOV   A,CRCH
            JNC   WORDCRC_ZERO_H
            XRL   A,#08H;CRC=X16+X12+X5+1
    WORDCRC_ZERO_H:
            RRC   A
            MOV   CRCH,A
            MOV   A,CRCL
            JNB   F0,WORDCRC_ZERO_L
            XRL   A,#10H;CRC=X16+X12+X5+1
    WORDCRC_ZERO_L:
            RRC   A
            MOV   CRCL,A
            POP   ACC
            POP   PSW
            RET
    TABLE_1400000594AE6801:
    ;CRC    14 00000594AE68 01
            DB 014H,000H,000H,005H,094H,0AEH,068H,001H
    TABLE_96000005949C6F01:
    ;CRC    96 000005949C6F 01
            DB 096H,000H,000H,005H,094H,09CH,06FH,001H
    TABLE_5800000599602701:
    ;CRC    58 000005996027 01
            DB 058H,000H,000H,005H,099H,060H,027H,001H
    TABLE_66000000FBC52B01:
    ;CRC    66 000000FBC52B 01
            DB 066H,000H,000H,000H,0FBH,0C5H,02BH,001H
    TABLE_E6000000FBD8B301:
    ;CRC    E6 000000FBD8B3 01
            DB 0E6H,000H,000H,000H,0FBH,0D8H,0B3H,001H
    TABLE_DEMO:
    ;CRC    2C 0123456789AB CD
    ;      DB 02CH,001H,023H,045H,067H,089H,0ABH,0CDH
    ;CRC    FB 0123456789CD AB
    ;      DB 0FBH,001H,023H,045H,067H,089H,0CDH,0ABH
    ;CRC    ED 0103456789AB CD
    ;       DB 0EDH,001H,003H,045H,067H,089H,0ABH,0CDH
    ;CRC    C0 0301456789AB CD
            DB 0C0H,003H,001H,045H,067H,089H,0ABH,0CDH
    ;CRC    E3 2301456789AB CD
    ;       DB 0E3H,023H,001H,045H,067H,089H,0ABH,0CDH
    ;CRC    EA 0123456789AB DC
    ;       DB 0EAH,001H,023H,045H,067H,089H,0ABH,0DCH
    ;CRC    FE 8023456789AB CD
    ;       DB 0FEH,080H,023H,045H,067H,089H,0ABH,0CDH
    ;CRC    EF 1023456789AB CD
    ;       DB 0EFH,010H,023H,045H,067H,089H,0ABH,0CDH
    ;CRC    F2 123456789ABC D0
    ;       DB 0F2H,012H,034H,056H,078H,09AH,0BCH,0D0H
    ;CRC    84 8023456789AB CF
    ;       DB 084H,080H,023H,045H,067H,089H,0ABH,0CFH
    ;CRC    3D 8023456789AB D0
    ;       DB 03DH,080H,023H,045H,067H,089H,0ABH,0D0H
    ;CRC    00 8023456789AB D1
    ;       DB 000H,080H,023H,045H,067H,089H,0ABH,0D1H
    ;CRC    47 8023456789AB D2
    ;       DB 047H,080H,023H,045H,067H,089H,0ABH,0D2H
    ;CRC    7A 8023456789AB D3
    ;       DB 07AH,080H,023H,045H,067H,089H,0ABH,0D3H
    ;CRC    C9 8023456789AB D4
    ;       DB 0C9H,080H,023H,045H,067H,089H,0ABH,0D4H
    TABLE_WORDCRC0:
            DB 000H,001H,002H,003H,004H,005H,006H,007H
    TABLE_WORDCRC1:
            DB 001H,000H,000H,001H,003H,002H,001H,000H
    TABLE_WORDCRC0X:
            DB 000H,001H,002H,003H,004H,005H,006H,007H
    TABLE_WORDCRC1X:
            DB 007H,006H,005H,004H,003H,002H,001H,000H
            END





  • note.gifCRC8算法“国际标准”的源程序(3106字)hotpower[28次]2004-9-5 13:23:33
    CRC8算法“国际标准”的源程序
    HotPower 发表于 2004-4-27 08:06 侃单片机 ←返回版面   举报该贴

    在DALLAS的DS1990A.PDF文件中,CRC8的51源程序
    PROC    DO_CRC
    DO_CRC:
            PUSH  ACC
            PUSH  B
            PUSH  ACC
            MOV   B,#8
    CRC_LOOP:
            XRL   A,CRC
            RRC   A
            MOV   A,CRC
            JNC   ZERO
            XRL   A,#18H;CRC=X8+X5+X4+1
    ZERO:
            RRC   A
            MOV   CRC,A
            POP   ACC
            RR    A
            PUSH  ACC
            DJNZ  B,CRC_LOOP
            POP   ACC
            POP   B
            POP   ACC
            RET
    END



  • note.gifCRC8“洞中探密”——三角及冗余校验密码技术.html应用(5530字)hotpower[23次]2004-9-5 13:26:09
    CRC8“洞中探密”——三角及冗余校验密码技术.html应用
    hotpower 发表于 2004-4-5 15:32 侃单片机 ←返回版面   举报该贴

    CRC8“洞中探密”——三角及冗余校验密码技术.html应用

    注:本文的全部运算可用<三角及冗余校验密码技术.html>调试
        本文只以CRC8为例,CRC16~CRC64完全一样!

    本文是
    CRC8“深山探宝”——三角及冗余校验密码技术.html应用
    的序集。主要论述CRC8在加密及解密方面的应用。

    大家知道,CRC主要是由初值、权、原码三个基本“元素”构成。
    采用响应的CRC算法将会得到一个CRC结果。

    例:采用右移CRC8时
        初值=00H 权=18H 原码=88H
        则:CRC结果=4EH
        初值=00H 权=19H 原码=88H
        则:CRC结果=4EH

    例:采用左移CRC8时
        初值=00H 权=18H 原码=88H
        则:CRC结果=C3H
        初值=00H 权=98H 原码=88H
        则:CRC结果=C3H

    从上可以看出,当采用右移CRC8时,与D0无关。
                  当采用左移CRC8时,与D7无关。
    所以可以得出一个“结论”——CRC具有多值“特性”。

    例:采用右移CRC8时
        初值=12H 权=18H 原码=88H
        则:CRC结果=6FH
        初值=21H 权=18H 原码=88H
        则:CRC结果=33H

    例:采用左移CRC8时
        初值=12H 权=18H 原码=88H
        则:CRC结果=E2H
        初值=21H 权=18H 原码=88H
        则:CRC结果=74H

    从上可以看出,当CRC的初值不同时,其CRC结果也不同。
                  当采用左移CRC8时,与D7无关。
    所以可以得出一个“结论”——CRC具有多态“特性”。

    CRC的“多值多态特性”主要是由24位的CRC运算得到8位的CRC结果产生的。
    正是这个“特性”,就使得CRC密码可以“群魔乱舞”。
    本文只讲述CRC加密和解密的最基本的原理...

    在密码学中,主要由加密钥、解密钥、明文、密文等构成。
    而在CRC密码中,一般采用一个密钥,及加密钥就是解密钥,这样较方便些,
    但加密和解密的算法不同,且是可逆的。
    CRC的密钥实际上是由初值和权两部分组成的。
    而CRC的密文实际上就是用CRC的密钥对CRC的原文进行CRC加密运算得到的CRC结果。
    在进行CRC解密时,就是用CRC的密钥对CRC的密文进行CRC解密运算得到的CRC结果。

    例如:明文(HEX码)为0123456789ABCDEF.
        设CRC密钥为1234H(初值=12H,权=34H)则:
        采用右移CRC8时,密文为:ECC746D28E5F180A.
        采用左移CRC8时,密文为:34F9734213BEAD3C.
        
        设CRC密钥为0123H(初值=01H,权=23H)则:
        采用右移CRC8时,密文为:0001AA8900769910.
        采用左移CRC8时,密文为:009FA021FFDC6CD6.

    为了使加密更可靠,一般会将CRC密钥加长,以破坏CRC的“继承”关系,防止解密者
    利用CRC的“继承”关系从密文的任意位置解密,逼迫他从头解密。
    这样只有知道了CRC密钥,才能根据CRC密文解密出CRC原文。
    例:设CRC密钥为123456H,可用加长的56H依次异或上例中的密文
        采用右移CRC8时,未加长的密文为:ECC746D28E5F180A.(未异或56H时,及CRC密钥为
    1234H)
                          加长的密文为:BA911084D8094E5C.(异或56H时,及CRC密钥为
    123456H)
        其他就不举例了。解密和加密基本相同。。。

    从本文中可以看出:
        若采用CRC8 时,CRC8 的密钥为24位。
        若采用CRC16时,CRC16的密钥为48位。
        若采用CRC32时,CRC32的密钥为96位。
        若采用CRC64时,CRC64的密钥为192位。

    所以,CRC加密和解密在MCU中是很容易实现的。          




  • note.gifCRC逆运算...(532字)hotpower[21次]2004-9-5 14:56:12
    我“发明”的CRC逆运算本来就是任意数据流加密及解密
    HotPower 发表于 2004-4-25 02:49 侃单片机 ←返回版面   举报该贴

    课本的经典的CRC算法几乎全是右移及查表的。

    我研究了CRC十余年,最后“悟出”了CRC还可分左右移,可逆等“硬道理”并通过实战,效
    果非常好。

    实际上,在串行通讯中(包括无线),采用“按位CRC”实现密文传送,解密比加密更
    快。。。

    由于我已将算法用HTML文件格式公开,但愿它能在MCU中得到更广泛的应用,以了我之心
    愿。。。




    • 32.GIF (0字)DieHeart[3次]2004-9-5 15:35:17

  • note.gif有关"CRC权"的来历(2434字)hotpower[33次]2004-9-5 14:59:57
    四子(EMC单片机)归边(台湾孤岛)没救了(难统一)
    HotPower 发表于 2004-4-29 01:57 侃单片机 ←返回版面   举报该贴

    注:长子(侃单片机)
        次子(AVR单片机)
        三子(PIC单片机)
        四子(EMC单片机)

    说实话,EMC单片机被从最新论坛发配到资料商务交友,都是我和你及水管工的错!!!

    想当初,我们三人在EMC上进行“游击战”,“水漫金山”。。。

    更可恨的是气走了匠人,让我做什么“三浇主”——专业灌水。。。
    我又来了一个“21IC论坛永远无人打破的辞职记录”。。。

    你说“可气不可气”???

    为此,我多次向匠人“赔礼道歉”,并用“血”写了一份“卖身契”——
    《群魔乱舞的CRC---三角及冗余校验密码技术.html 》

    我内疚呀。。。

    所以,我在“赎罪”。。。

    但我看21IC真是“大义灭亲”了,所以才将四子发配“边塞”,“永不听用”!

    我也无愧,因为我结识了您这位好友。。。

    那份“同性恋”之作不知还在EMC否???

    确实,这里有“几对”像我俩一样的“老猫”???

    为此,我——无怨无悔!!!

    提到“四子归边”,又让我想到了中国象棋。。。

    虽然明天要出差,在临睡前在谈个中国象棋与编程思维问题。
    在80年代初,我“创立”了“中国象棋数字编码方案”并成功地“嵌入”到国标码中。。。
    具体“数字棋子”为:
    1-车 2-马 3-相(象) 4-仕(士) 5-帅(将) 7-兵(卒) 8-炮
    0-平 6-前(进) 9-后(退)

    1.炮二平五 马8进7    1.8205  2867
    2.马二进三 车9平8    2.2263  1908
    。。。。。。。。。。。。。。。。。。。
    11.前兵进一 后炮退3  11.6761  9893
    12.前车平三 后卒平4  12.6103  9704
    。。。。。。。。。。。。。。。。。。。


    可能有人会拍砖,但这个编码和棋谱可以“告诉”我们:
    学习和生活甚至“灌水”都有紧密联系的。。。
    不要死读书,不要崇拜“经典”!!!
    只有自己搞出来的才叫“经典”!!!别人再“牛”对自己都无用。
    不要“这山望着那山高”,不要“自己的孩子,别人的老婆”!!!
    和高手相遇时,要少说多“偷”,会也说一半!!!
    要将“痛苦埋藏在心里”!!!
    不要整天“妹妹找歌泪花流”!!!“网民天爷”。。。


    我们必须找到规律,才能更好地解决问题,不要直接就出“结论”





    • note.gif21IC的“权”,匠人的“财” (3898字)hotpower[18次]2004-9-5 15:01:54
      21IC的“权”,匠人的“财”
      HotPower 发表于 2004-4-28 23:02 侃单片机 ←返回版面   举报该贴


      --------------------------------------------------------------------------------
      ----
      CRC加密“分解因式”(16进制数):(密钥为0018,初值为00,权为18)
      第1步:初值为00,明文01,密文5E。(探亲生第1子)——密文5E
      第2步:初值为5E,明文2B,密文C7。(探亲生第2子)——密文5EC7
      第3步:初值为C7,明文C5,密文BC。(探亲生第3子)——密文5EC7BC
      第4步:初值为BC,明文FB,密文C5。(探亲生第4子)——密文5EC7BCC5
      第5步:初值为C5,明文00,密文F5。(探亲生第5子)——密文5EC7BCC5F5
      第6步:初值为F5,明文00,密文4B。(探亲生第6子)——密文5EC7BCC5F54B
      第7步:初值为4B,明文00,密文66。(探亲生第7子)——密文5EC7BCC5F54B66
      --------------------------------------------------------------------------------
      ----
      CRC解密“分解因式”(16进制数):(密钥为0018,初值为00,权为18)
      第1步:初值为00,密文5E,明文01。(寻浪子第1子)——明文01
      第2步:初值为5E,密文C7,明文2B。(寻浪子第2子)——明文012B
      第3步:初值为C7,密文BC,明文C5。(寻浪子第3子)——明文012BC5
      第4步:初值为BC,密文C5,明文FB。(寻浪子第4子)——明文012BC5FB
      第5步:初值为C5,密文F5,明文00。(寻浪子第5子)——明文012BC5FB00
      第6步:初值为F5,密文4B,明文00。(寻浪子第6子)——明文012BC5FB0000
      第7步:初值为4B,密文66,明文00。(寻浪子第7子)——明文012BC5FB000000
      --------------------------------------------------------------------------------
      ----
      从以上加密及解密两个“分解因式”中可以看出:
      由于初值的对象不同,所以,采取的方法(函数)肯定不同。即其函数互为反函数。
      这就是CRC正运算和CRC逆运算!

      我们可以看出,XOR和CRC加密及解密是有着根本的区别的。
      XOR加密及解密共用一个,而CRC需两个。
      所以,XOR加密及解密2次后还原,而CRC经过2次同一函数后,将会“面目全非”!!!
      所以,CRC的密级要比XOR高的多。

      至于“多值”的问题,请看CRC解密“分解因式”中的第5步到第7步。
      “多值”问题的出现也会给解密者带来很大的难度,同时给他明文和密文可能也推不出
      “权”!
      “左移CRC算法”和“右移CRC算法”更会让他“哭爹叫娘”!!!

      对照两个“分解因式”可以看出:
      加密及解密的方法类同(有正函数和反函数之分),
      只要知道了权及初值和明文(或密文),就能得到所需的密文(或)明文.

      老大是“祖传秘方”,“一脉单传”。他掌握着21IC的财政大权——密钥的一半!(初值00)
      而其他六个“光屁股”兄弟只好依次从自己哥哥手中“讨饭”——将其密文作为初值!
      当然,要想真正了解(解密)21IC的“家世”(明文),还必须得到密钥的另一半——但在21IC
      手中!
      老大手握密钥的一半,六亲(弟)不认!

      所以,CRC解密的关键在于21IC手中的那一半的密钥(权)!!!
      而老大的那一半的密钥只对第1个明文字节有用!!!



      所以,只要我们夺了21IC的“权”,密文将不攻自破!揭开EMC的流浪之迷。。。
      老大的密钥就算了,找不到田鼠(初值)也没关系,了解EMC被“遗弃的原因”又能如
      何???

      看来老大是“六亲不认”,而21IC是“七亲不认”(多了一个EMC)。。。佩服!!!

      现在,知道“六亲不认”的典故了吧。。。也知道什么是CRC的“权”了吧

      郭靖:我没你厉害,敢当众推销“安防产品”,否则,我一定把初值定义为——初夜或处夜

      如何进行“改革开放”,掩盖“亲情”关系,是我们继续探讨CRC密码的“一个原则问
      题”。

      请大家继续探讨。。。
      若想将其改善,可以使用三角密码技术,让21IC手中的权——可变(玩弄权术)
      这样的密码将会很难破。。。


      夜猫子们,晚安,明早要到宝鸡出差,等我捉回一只“CRC鸡”吧。。。



  • note.gifCRC8“深山探宝”——三角及冗余校验密码技术.html应用 (3952字)hotpower[22次]2004-9-5 15:10:34
    CRC8“深山探宝”——三角及冗余校验密码技术.html应用
    HotPower 发表于 2004-3-7 02:00 侃单

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条