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 特征
- 一张静态的CRC32表或动态的CRC32表,表的元素个数为256,元素大小为4字节。
- 在计算CRC32时,会进行查表操作,然后异或上一次的CRC32结果并右移8位
- 最终形成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