验证 UDP 的 CRC32 给定有效负载的 .jpg 文件

问题描述 投票:0回答:2

我正在运行一个接收 UDP 数据包的服务器,该数据包包含 2 字节 CRC32 多项式和与 .jpg 文件相对应的可变数量的异或 DWORD。对于数据包中的每个 DWORD,数据包还包含 .jpg 文件中相应 DWORD 的索引。我还得到了实际的 .jpg 文件。

例如,数据包可以包含 10 个 DWORD,并将起始索引指定为 3,因此我们可以预期收到的 DWORD 与构成 .jpg 的第 4 个到第 11 个 DWORD 相对应。

我想通过将每个 DWORD 的 CRC32 值与 .jpg 中相应 DWORD 的 CRC32 值进行比较来验证每个 DWORD 的完整性。

我认为执行此操作的正确方法是将数据包中的每个 DWORD 及其 .jpg 中相应的 DWORD 除以提供的 CRC 多项式并分析余数。如果进行这些除法后余数相同,则数据包没有问题。然而,即使数据包保证正确,这些余数也永远不会相等。

以下是我如何读取实际 .jpg 的字节并将它们拆分为 DWORD:

def split(data):
    # Split the .jpg data into DWORDs
    chunks = []
    for i in range(0, len(data), 4):
        chunks.append(data[i: i + 4])
    return chunks

def get_image_bytes():
    with open("dog.jpg", "rb") as image:
        f = image.read()
        jpg_bytes = split(f)
        return jpg_bytes

现在我已经验证了 split() 函数的工作原理,据我所知, get_image_bytes() 通过调用 image.read() 正确读取 .jpg。

收到数据包后,我将每个 DWORD 转换为二进制并执行 mod 2 除法,如下所示:

jpg_bytes = get_image_bytes()
crc_key_bin = '1000110111100' # binary representation of the received CRC32 polynomial
d_words = [b'\xc3\xd4)v', ... , b'a4\x96\xbb']

iteration = 0 # For simplicity, assume the packet specified that the starting index is 0
for d in d_words:
    d_bin = format(int(d.hex(), 16), "b") # binary representation of the DWORD from the packet
    jpg_dword = format(int(jpg_bytes[iteration].hex(), 16), "b") # binary representation of the corresponding DWORD in dog.jpg
    remainder1 = mod2div(d_bin, crc_key_bin)      # <--- These remainders should be
    remainder2 = mod2div(jpg_dword, crc_key_bin)  # <--- equal, but they're not!

    iteration += 1

我测试了 mod2div() 函数,它在执行 mod 2 除法后返回预期的余数。

我哪里错了?我期望两个余数相等,但事实并非如此。我不确定从 .jpg 文件读取字节的方式是否不正确,是否使用错误的值执行 mod 2 除法,或者我是否完全误解了如何验证 CRC32 值。我将不胜感激任何帮助。

python udp checksum packet crc32
2个回答
0
投票

首先,不存在“2 字节 CRC32 多项式”这样的东西。 32 位 CRC 需要 32 位来指定多项式。

其次,CRC 多项式对于给定协议来说是固定的。为什么要传输 CRC 多项式,而不是简单地指定?你确定这是多项式吗?这一切都记录在哪里?

“异或双字”是什么意思?与什么进行异或?

并且,是的,我认为您完全误解了如何验证 CRC 值。您所需要做的就是以与另一端相同的方式计算消息的检查值,并将其与传输的检查值进行比较。 (对于任何检查值都是如此,而不仅仅是 CRC。)但是,我无法从您的描述中看出什么是根据什么计算的,或者是如何计算的。


0
投票

我想知道你是否已经弄清楚了?我面临着同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.