CRC校验算法

0X1 CRC概念

CRC,即循环冗余校验算法。是目前使用的最古老的校验算法(用于校验文件完整性,一般不用于加密,毕竟CRC是一种HASH算法,不可逆),将CRC加密生成的数字加在原数据之后,形成新的新的数据。

一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。

0X2 基本原理

在一个p位的二进制数据序列后面加上r位的校验值,形成一个新的二进制序列,校验值和原数据之间存在着某种特定的关系(有特定的HASH函数)。如果因某种不确定性因素而导致源文件损坏,相同的HASH关系算出来的校验值却不同,从而发现数据的损坏或丢失。

0X3 计算

CRC算法以多项式的系数来表示一系列的二进制序列,同时,多项式的指数表示他们在二进制序列里的位数(从0开始,常数项即x^0),同时,CRC采用多项式模2运行(不考虑进位,借位的二进制加减运算)。
一般来说,其形式为

	M(x).x^n=Q(x).K(x)-R(x)

0X3 错误检测

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

0X4 特征

  1. 一张静态的CRC32表或动态的CRC32表,表的元素个数为256,元素大小为4字节。
  2. 在计算CRC32时,会进行查表操作,然后异或上一次的CRC32结果并右移8位
  3. 最终形成8字节的CRC32值。

CTF中的CRC

由于CRC不可逆,所以无法进行逆向,只能通过爆破方法进行破解。

#!/usr/bin/python
# -*- coding:utf8 -
 
import zlib

table = "2356DESTZcqv"
total = 0
for a in table:
    print("Tried: " + str(total))
    for b in table:
        for c in table:
            for d in table:
                for e in table:
                    for f in table:
                        for g in table:
                            for h in table:
                                temp = a + b + c + d + e + f + g + h
                                total += 1
                                if((zlib.crc32(temp) & 0xffffffff) == 0x5984f05e):
                                    print temp
                                    exit(0)

注意:python2

参考资料:
百度
夏冰
看雪

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值