CRC

          CRC,全称Cyclic Redundancy Code,意为循环冗余码校验。它是利用除法及余数的原理来作错误侦测的。

         实际应用时,发送方计算出CRC值并随数据一同发送给接收装置,接收方对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

         CRC在发送端编码和接收端校验时,都可以利用事先约定的生成多项式G(X)来得到,k位要发送的信息位可对应一个(k-1)次多项式K(X),r位冗余位对应于一个(r-1)次多项式R(X),由k位信息位后面加上r位冗余位组成的n=k+r的码字则对应于一个(n-1)次多项式T(X)X×K(X)+R(X)。也即在发送端产生一个循环冗余码,附加在信息位后面一起发送到接收端。接收端的检验过程就是将接收到的码字多项式除以G(X),若余式为零则认为传输无差错;若余式不为零则传输有差错。

       下面以最常用的CRC-16为例来说明其生成过程。
       CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

代码:

package CRC;   
public class CRC16{
    public int value;   
    public CRC16(){
        value = 0;
        }   
      
    /** update CRC with byte b */   
    public void update(byte aByte){
        int a, b;
        a = (int) aByte;   
        for (int count = 7; count >=0; count--) {
            a = a << 1;   
            b = (a >>>8) & 1;   
             if ((value & 0x8000) != 0) {
                 value = ((value << 1) + b) ^ 0x1021;   
             } else {   
                 value = (value << 1) + b;   
             }   
         }   
         value = value & 0xffff;   
         return;   
    }   
      
    /** reset CRC value to 0 */   
    public void reset(){
        value = 0;   
    }   
          
    public int getValue()   
    {   
        return value;   
    }   
      
    public static void main(String[] args) {   
        CRC16 crc16 = new CRC16();   
        byte[] b = new byte[]{   
                //(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72   
                (byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE   
                ,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00   
                ,(byte) 0x00,(byte)0x00   
         };   
        for (int k = 0; k < b.length; k++)   
        {   
            crc16.update(b[k]);   
        }   
        System.out.println(Integer.toHexString(crc16.getValue()));   
        System.out.println(Integer.toHexString(b.length));   
    }   
}  

你可能感兴趣的:(信息安全)