如何计算WinRAR文件的CRC?

4

我从 Wikipedia 上了解到CRC计算算法。关于RAR文件的结构,我在这里读到过例如,文章中写道:

The file has the magic number of:

   0x 52 61 72 21 1A 07 00

Which is a break down of the following to describe an Archive Header:

   0x6152 - HEAD_CRC
   0x72   - HEAD_TYPE
   0x1A21 - HEAD_FLAGS
   0x0007 - HEAD_SIZE
如果我理解正确的话,HEAD_CRC(0x6152)是标志块(MARK_HEAD)的CRC值。我在某处读到,在WinRAR文件中,CRC是通过标准的多项式0xEDB88320来计算的,但当CRC的大小小于4个字节时,需要使用较低有效字节。在这种情况下(当然如果我理解正确),CRC值为0x6152,因此它有2个字节。现在,我不知道该取哪些字节作为较低有效位。从标准多项式(0xEDB88320)中?那么0x8320可能是这个多项式的较低有效字节。接下来,如果我们已经有了正确的多项式,如何计算标记块的CRC(即以下字节:0x52 61 72 21 1A 07 00)?

这个“某处”指的是你读到的32位标准多项式在哪里?你确定两个来源都指的是相同的RAR版本吗?Forensicswiki似乎记录了旧格式,使用16位CRC,而当前的RAR 5.0存档格式 使用不同的文件结构和32位CRC。你有查看过RARLAB提供的解压缩源代码吗? - BlackJack
@BlackJack,我是波兰人,在这个波兰站点(http://www.winrar.pl/winrar/jaka-jest-struktura-naglowka-programu-rar.html)上找到了有关此多项式0xEDB88320的信息。我有WinRAR 3.91,创建了一个示例存档并检查了该存档的前7个字节-实际上,这些字节具有以下值:0x 52 61 72 21 1A 07 00。现在我想计算这些值的CRC。 - Doman
我认为你不应该在这里计算CRC。这是一个固定的字节序列,前四个字节以ASCII形式拼写出“'Rar!'”,第五个字节的值会导致DOS和Windows在文本模式下打开时停止读取。使用这些值并巧合地得到一个CRC,在解释为ASCII字符时拼写出“Ra”是非常不可能的。 - BlackJack
2个回答

2
很可能旧格式的16位检查并不是来自32位CRC。标准的32位CRC,被zip和rar使用,在头部的最后五个字节上应用,没有任何一部分等于前两个字节。波兰页面似乎在声称这两个字节的检查是32位CRC的低两个字节时是错误的。
从文档中可以看出,该头部以与旧格式中其他块相同的标准方式构建,因此作者为了好玩安排了他的格式给出检查值"Ra",以便它可以拼写出"Rar!",然后是一个文本终止控制-Z。
我在unrar源代码中找到了另一个16位检查,但该检查也不会产生这些值。
哦,还有,你不能取CRC多项式的一部分,并期望它成为较小检查的良好CRC多项式。波兰页面所说的是您将计算完整的32位CRC,然后取结果的低两个字节。但是这对于魔术数字标题不起作用。

0

安装包中包含了一个名为TechNote.txt的文件,其中详细介绍了WinRAR的相关信息:

标记块实际上被视为一个固定的字节序列:0x52 0x61 0x72 0x21 0x1a 0x07 0x00

正如您所指出的那样,在结尾处可以读到以下内容:

CRC是使用标准多项式0xEDB88320计算的。如果CRC的大小小于4个字节,则仅使用低位字节。

在Python中,计算和获取2个低位字节的方法如下:

zlib.crc32(correct_byte_range) & 0xffff

rerar有一些代码可以实现这个功能,就像它使用的rarfile库一样。ReScene .NET源代码中有一个用于计算CRC32哈希的C#算法。另请参阅如何数学计算CRC32?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接