CRC加密算法原理讲解

CRC加密算法原理

最近在做UDP的通信,考虑到UDP的不可靠性,因此在传输信息时想加入CRC校验的方式来确保传输内容的完整性与正确性。在网上查看了很多关于CRC的理论以及代码实现,讲解的都不太满意,因此,决定写下这篇文章,一来加深自己对CRC的理解,再者也能帮助想了解CRC的小白们。

 

一、CRC全称及其原理

CRC的英文全称为Cyclic Redundancy Check,即循环冗余校验。百科上给出这样的定义:“CRC是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。”百科的定义给我一种想接受又很模糊接受的想法,除法和余数原理就已经让我感觉摸不着头脑。看到此处的你也不要着急,先来说一下我对CRC校验的理解。CRC的原理其实很简单,简单来说就是在你想传输的数据后加上一定长度的二进制(0,1)校验码,此校验码和想传输的数据有着一定的关系,接收方收到加密的数据后再进行一定的运算,如果传输过程中受到干扰,把关系破坏,运算结果就为不期望的,包要丢弃。

 

此处我想说几点不清晰的点:

问题1:一定长度的校验码,一定长度是如何确定的?

在解释这个问题前,先来说明几个简单的概念:

(1)多项式模2运行:实际上是按位异或(Exclusive OR)运算,即相同为0,相异为1,也就是不考虑进位、借位的二进制加减运算。如:10011011 + 11001010 = 01010001。

(2)生成多项式(generator polynomial):当进行CRC检验时,发送方与接收方需要事先约定一个除数,即生成多项式,一般记作G(x)。生成多项式的最高位与最低位必须是1。常用的CRC码的生成多项式有:

CRC8=X8+X5+X4+1

CRC-CCITT=X16+X12+X5+1

CRC16=X16+X15+X5+1

CRC12=X12+X11+X3+X2+1

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1

每一个生成多项式都可以与一个代码相对应,如CRC8对应代码:100110001。

其实,在了解了生成多项式的概念之后,下面解释校验码长度的由来就非常的清晰了,因为检验码的长度和生成多项式有着直接的关系。设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:

      V(x)=A(x)g(x)=x^R * m(x) + r(x);

此处应该注意一点,R次多项式对应的二进制位数为(R+1),在做位数运算时一定要注意1的差异。

 

问题2:校验码是如何确定的,它和原始数据有什么关系?

在问题1中已经确定了校验码的位数,且关系式 V(x)=A(x)g(x)=x^R * m(x) + r(x)也已经确定,现在需要确定的校验码即为r(x),也称为冗余码。

r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1位;若不足,而在高位补0)。

举例说明,例子来源:https://blog.csdn.net/android_mnbvcxz/article/details/78902737

设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R=5。在M后加5个0,然后对P做模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110。

 

问题3:所谓的一定运算是什么?

当接收方收到数据后,用收到的数据对P(事先约定的)进行模2除法,若余数为0,则认为数据传输无差错;若余数不为0,则认为数据传输出现了错误,由于不知道错误发生在什么地方,因而不能进行自动纠正,一般的做法是丢弃接收的数据。

 

说明:附上一点程序(希望对你有用):

public class CRC32 {
    private static long pCRCTable[] = 
       {
            0x00000000l, 0x1942B361l, 0x328566C2l, 0x2BC7D5A3l, 0x650ACD84l, 0x7C487EE5l, 0x578FAB46l, 0x4ECD1827l,
            0xCA159B08l, 0xD3572869l, 0xF890FDCAl, 0xE1D24EABl, 0xAF1F568Cl, 0xB65DE5EDl, 0x9D9A304El, 0x84D8832Fl,
            0x18CE5601l, 0x018CE560l, 0x2A4B30C3l, 0x330983A2l, 0x7DC49B85l, 0x648628E4l, 0x4F41FD47l, 0x56034E26l,
            0xD2DBCD09l, 0xCB997E68l, 0xE05EABCBl, 0xF91C18AAl, 0xB7D1008Dl, 0xAE93B3ECl, 0x8554664Fl, 0x9C16D52El,
            0x319CAC02l, 0x28DE1F63l, 0x0319CAC0l, 0x1A5B79A1l, 0x54966186l, 0x4DD4D2E7l, 0x66130744l, 0x7F51B425l,
            0xFB89370Al, 0xE2CB846Bl, 0xC90C51C8l, 0xD04EE2A9l, 0x9E83FA8El, 0x87C149EFl, 0xAC069C4Cl, 0xB5442F2Dl,
            0x2952FA03l, 0x30104962l, 0x1BD79CC1l, 0x02952FA0l, 0x4C583787l, 0x551A84E6l, 0x7EDD5145l, 0x679FE224l,
            0xE347610Bl, 0xFA05D26Al, 0xD1C207C9l, 0xC880B4A8l, 0x864DAC8Fl, 0x9F0F1FEEl, 0xB4C8CA4Dl, 0xAD8A792Cl,
            0x63395804l, 0x7A7BEB65l, 0x51BC3EC6l, 0x48FE8DA7l, 0x06339580l, 0x1F7126E1l, 0x34B6F342l, 0x2DF44023l,
            0xA92CC30Cl, 0xB06E706Dl, 0x9BA9A5CEl, 0x82EB16AFl, 0xCC260E88l, 0xD564BDE9l, 0xFEA3684Al, 0xE7E1DB2Bl,
            0x7BF70E05l, 0x62B5BD64l, 0x497268C7l, 0x5030DBA6l, 0x1EFDC381l, 0x07BF70E0l, 0x2C78A543l, 0x353A1622l,
            0xB1E2950Dl, 0xA8A0266Cl, 0x8367F3CFl, 0x9A2540AEl, 0xD4E85889l, 0xCDAAEBE8l, 0xE66D3E4Bl, 0xFF2F8D2Al,
            0x52A5F406l, 0x4BE74767l, 0x602092C4l, 0x796221A5l, 0x37AF3982l, 0x2EED8AE3l, 0x052A5F40l, 0x1C68EC21l,
            0x98B06F0El, 0x81F2DC6Fl, 0xAA3509CCl, 0xB377BAADl, 0xFDBAA28Al, 0xE4F811EBl, 0xCF3FC448l, 0xD67D7729l,
            0x4A6BA207l, 0x53291166l, 0x78EEC4C5l, 0x61AC77A4l, 0x2F616F83l, 0x3623DCE2l, 0x1DE40941l, 0x4A6BA20l,
            0x807E390Fl, 0x993C8A6El, 0xB2FB5FCDl, 0xABB9ECACl, 0xE574F48Bl, 0xFC3647EAl, 0xD7F19249l, 0xCEB32128l,
            0xC672B008l, 0xDF300369l, 0xF4F7D6CAl, 0xEDB565ABl, 0xA3787D8Cl, 0xBA3ACEEDl, 0x91FD1B4El, 0x88BFA82Fl,
            0x0C672B00l, 0x15259861l, 0x3EE24DC2l, 0x27A0FEA3l, 0x696DE684l, 0x702F55E5l, 0x5BE88046l, 0x42AA3327l,
            0xDEBCE609l, 0xC7FE5568l, 0xEC3980CBl, 0xF57B33AAl, 0xBBB62B8Dl, 0xA2F498ECl, 0x89334D4Fl, 0x9071FE2El,
            0x14A97D01l, 0x0DEBCE60l, 0x262C1BC3l, 0x3F6EA8A2l, 0x71A3B085l, 0x68E103E4l, 0x4326D647l, 0x5A646526l,
            0xF7EE1C0Al, 0xEEACAF6Bl, 0xC56B7AC8l, 0xDC29C9A9l, 0x92E4D18El, 0x8BA662EFl, 0xA061B74Cl, 0xB923042Dl,
            0x3DFB8702l, 0x24B93463l, 0x0F7EE1C0l, 0x163C52A1l, 0x58F14A86l, 0x41B3F9E7l, 0x6A742C44l, 0x73369F25l,
            0xEF204A0Bl, 0xF662F96Al, 0xDDA52CC9l, 0xC4E79FA8l, 0x8A2A878Fl, 0x936834EEl, 0xB8AFE14Dl, 0xA1ED522Cl,
            0x2535D103l, 0x3C776262l, 0x17B0B7C1l, 0x0EF204A0l, 0x403F1C87l, 0x597DAFE6l, 0x72BA7A45l, 0x6BF8C924l,
            0xA54BE80Cl, 0xBC095B6Dl, 0x97CE8ECEl, 0x8E8C3DAFl, 0xC0412588l, 0xD90396E9l, 0xF2C4434Al, 0xEB86F02Bl,
            0x6F5E7304l, 0x761CC065l, 0x5DDB15C6l, 0x4499A6A7l, 0x0A54BE80l, 0x13160DE1l, 0x38D1D842l, 0x21936B23l,
            0xBD85BE0Dl, 0xA4C70D6Cl, 0x8F00D8CFl, 0x96426BAEl, 0xD88F7389l, 0xC1CDC0E8l, 0xEA0A154Bl, 0xF348A62Al,
            0x77902505l, 0x6ED29664l, 0x451543C7l, 0x5C57F0A6l, 0x129AE881l, 0x0BD85BE0l, 0x201F8E43l, 0x395D3D22l,
            0x94D7440El, 0x8D95F76Fl, 0xA65222CCl, 0xBF1091ADl, 0xF1DD898Al, 0xE89F3AEBl, 0xC358EF48l, 0xDA1A5C29l,
            0x5EC2DF06l, 0x47806C67l, 0x6C47B9C4l, 0x75050AA5l, 0x3BC81282l, 0x228AA1E3l, 0x094D7440l, 0x100FC721l,
            0x8C19120Fl, 0x955BA16El, 0xBE9C74CDl, 0xA7DEC7ACl, 0xE913DF8Bl, 0xF0516CEAl, 0xDB96B949l, 0xC2D40A28l,
            0x460C8907l, 0x5F4E3A66l, 0x7489EFC5l, 0x6DCB5CA4l, 0x23064483l, 0x3A44F7E2l, 0x11832241l, 0x08C19120l
         };
    
    private static short gmCrcTabReflect[] =
        {
            0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
            0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
            0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
            0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
            0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
            0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
            0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
            0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
            0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
            0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
            0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
            0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
            0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
            0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
            0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
            0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
        };
    
    public static long calculate(byte[] pBuffer, long bufferLen){
        long i = 0;
        long x = 0;
        short y = 0;
        if(pCRCTable == null || pBuffer == null){
            return -1;
        }
        
        for(i=0;i<bufferLen;i++){
            byte high = 0;
            byte low = pBuffer[(int) i];
            short z = (short)(((high&0x000000FF)<<8)|(0x000000FF&low));
            
            y=gmCrcTabReflect[z];
            x = (x>>8)^pCRCTable[(int) ((x^(long)y)&0x000000FFl)];
        }

        return x;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值