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

2024-05-14 03:40:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我认为这样做的正确方法是将数据包中的每个DWORD和.jpg中相应的DWORD除以提供的CRC多项式,然后分析余数。如果在进行这些划分之后,剩余部分是相同的,那么数据包就没有问题。然而,即使对于保证正确的数据包,这些余数也永远不相等

下面是我如何读取react.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值。我非常感谢你的帮助


Tags: 文件theinimagedataget字节bytes
1条回答
网友
1楼 · 发布于 2024-05-14 03:40:26

首先,没有所谓的“2字节CRC32多项式”。32位CRC需要32位来指定多项式

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

“异或德沃兹”是什么意思?独家的还是用什么

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

相关问题 更多 >