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

Python 验证有效负载的UDP给定.jpg文件的CRC32,python,udp,checksum,packet,crc32,Python,Udp,Checksum,Packet,Crc32,我正在运行一个服务器,它接收包含2字节CRC32多项式和与.jpg文件相对应的可变数量的异或DWORD的UDP数据包。数据包还包含.jpg文件中数据包中每个DWORD对应DWORD的索引。我还得到了实际的.jpg文件 例如,数据包可以包含10个DWORD,并将起始索引指定为3,因此我们可以期望接收到的DWORD与构成.jpg的第4个到第11个DWORD相对应 我想通过将每个DWORD的CRC32值与.jpg中相应DWORD的CRC32值进行比较来验证它们的完整性 我认为这样做的正确方法是将数据包

我正在运行一个服务器,它接收包含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
jpg_bytes=get_image_bytes()
crc_key_bin='1000110111100'#接收到的CRC32多项式的二进制表示
d_words=[b'\xc3\xd4)v',…,b'a4\x96\xbb']
迭代=0#为简单起见,假设指定的数据包起始索引为0
对于d,用d_表示:
d#bin=数据包中DWORD的格式(int(d.hex(),16),“b”)#二进制表示
jpg_dword=format(int(jpg_bytes[iteration].hex(),16),“b”)#dog.jpg中对应dword的二进制表示形式

remainder1=mod2div(d_-bin,crc_-key_-bin)#首先,没有所谓的“2字节CRC32多项式”。32位CRC需要32位来指定多项式

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

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


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

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

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

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


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

啊,我看到了我的一些困惑所在。我提到的“2字节CRC32多项式”在我的项目规范中实际上被称为“重复异或键”。我根本不确定那到底是什么。我在另一篇文章中向您展示了我项目的文档。虽然我仍然有一些困惑,但从那以后我已经澄清了一些。数据包中的DWORD被称为“重复键XOR’d循环校验和CRC32 DWORD”,因此我假设它们与“重复XOR键”是异或的。但是,我注意到在CRC wikipedia页面上指定了CRC32的一个特定多项式…我认为这很简单,只要在数据包中的DWORD上运行binascii.CRC32(),并在jpg字节中运行相应的DWORD,但它们不象etiher那样匹配。有许多多项式,以及一系列可能的初始值、最终xor值和位反射。啊,我看到了我的一些困惑所在。我提到的“2字节CRC32多项式”在我的项目规范中实际上被称为“重复异或键”。我根本不确定那到底是什么。我在另一篇文章中向您展示了我项目的文档。虽然我仍然有一些困惑,但从那以后我已经澄清了一些。数据包中的DWORD被称为“重复键XOR’d循环校验和CRC32 DWORD”,因此我假设它们与“重复XOR键”是异或的。但是,我注意到在CRC wikipedia页面上指定了CRC32的一个特定多项式…我认为这很简单,只要在数据包中的DWORD上运行binascii.CRC32(),并在jpg字节中运行相应的DWORD,但它们不象etiher那样匹配。有许多多项式,以及一系列可能的初始值、最终xor值和位反射。