【问题标题】:How to calculate CRC of a WinRAR file?如何计算 WinRAR 文件的 CRC?
【发布时间】:2015-12-28 12:15:50
【问题描述】:

我从Wikipedia知道CRC计算算法。关于我阅读here 的RAR 文件的结构。比如有这样写:

文件的幻数为:

   0x 52 61 72 21 1A 07 00

以下是描述存档标头的细分:

   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(即从以下字节:0x 52 61 72 21 1A 07 00)?

【问题讨论】:

  • 您读到的关于 32 位标准多项式的“某处”在哪里?您确定两个来源都引用相同的 RAR 版本吗? forensicswiki 似乎使用 16 位 CRC 记录旧格式,而当前 RAR 5.0 archive format 使用具有 32 位 CRC 的不同文件结构。你看过RARLAB提供的解压器源码吗?
  • @BlackJack,我是 Pole,我在这个波兰语 site 上找到了关于这个多项式 0xEDB88320 的信息。我有 WinRAR 3.91,创建了示例存档并检查了该存档的前 7 个字节 - 实际上,字节具有以下值:0x 52 61 72 21 1A 07 00。现在我想计算这些值的 CRC。
  • 我认为您不应该在这里计算 CRC。这是一个固定的字节序列,在前四个字节中用 ASCII 拼出'Rar!',第五个字节值导致 DOS 和 Windows 在以文本模式打开时结束读取。使用这些值并巧合地在解释为 ASCII 字符时以拼写为“Ra”的 CRC 结尾是极不可能的。

标签: crc rar winrar


【解决方案1】:

可能对不是从 32 位 CRC 派生的旧格式进行 16 位检查。 zip 和 rar 使用的标准 32 位 CRC 应用于标头的最后五个字节,没有部分等于前两个字节。波兰页面声称两字节校验是 32 位 CRC 的低两字节似乎是不正确的。

从文档中确实可以看出,该标头是以标准方式构造的,与旧格式中的其他块一样,因此作者为了好玩,将他的格式安排为提供检查值“Ra”,以便它可以拼出“Rar!”后跟一个文本终止控件-Z。

我在 unrar 源代码中发现了另一个 16 位检查,但该检查也不会产生这些值。

哦,不,您不能参与 CRC 多项式并期望它是用于较小检查的良好 CRC 多项式。波兰语页面的意思是您将计算完整的 32 位 CRC,然后 然后 取结果的低两个字节。但是,这不适用于幻数标头。

【讨论】:

    【解决方案2】:

    安装中包含的每个 WinRAR TechNote.txt 文件:

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

    正如您已经指出的,在最后您可以阅读:

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

    在 Python 中,2 个低位字节的计算和抓取是这样的:

    zlib.crc32(correct_byte_range) & 0xffff
    

    rerar 有一些代码可以做到这一点,就像它使用的 rarfile 库一样。 ReScene .NET source code 在 C# 中有一个用于计算 CRC32 哈希的算法。另见How do I calculate CRC32 mathematically?

    【讨论】:

      最近更新 更多