Python 校验和udp计算

Python 校验和udp计算,python,networking,checksum,packet,Python,Networking,Checksum,Packet,我想计算要发送的UDP报头数据包的校验和: packetosend = """60 00 00 00 00 24 3a 40 20 02 c0 a8 01 50 00 01 00 00 00 00 00 00 09 38 20 02 c0 a8 01 50 00 01 00 00 00 00 00 00 09 6f""" 所以我需要加入这个utf-16(不是问题)并计算这个特定数据包的校验和。我该怎么做 谢谢 编辑:是的,它是ICMPv6数据包的IPv6报头,无论如何,我想知道的是公式,以及

我想计算要发送的UDP报头数据包的校验和:

packetosend = """60 00 00 00 00 24 3a 40 20 02 c0 a8 01 50 00 01 00 00 
00 00 00 00 09 38 20 02 c0 a8 01 50 00 01 00 00 00 00 00 00 09 6f"""
所以我需要加入这个utf-16(不是问题)并计算这个特定数据包的校验和。我该怎么做

谢谢

编辑:是的,它是ICMPv6数据包的IPv6报头,无论如何,我想知道的是公式,以及它是如何工作的

我将给出另一个ICMP ping echo(v4)数据包的示例:


谢谢。

我觉得这不像UDP数据包。它看起来像ICMPv6数据包的IPv6报头,但数据包的实际有效负载丢失

IPv6标头

例如,校验和是“从类型字段开始的ICMP消息的16位1的补码和的16位1的补码。”涉及进位的特殊处理

def carry_around_add(a, b):
    c = a + b
    return (c & 0xffff) + (c >> 16)

def checksum(msg):
    s = 0
    for i in range(0, len(msg), 2):
        w = ord(msg[i]) + (ord(msg[i+1]) << 8)
        s = carry_around_add(s, w)
    return ~s & 0xffff
def随身携带添加(a、b):
c=a+b
返回(c&0xffff)+(c>>16)
def校验和(msg):
s=0
对于范围内的i(0,len(msg),2):

w=ord(msg[i])+(ord(msg[i+1])有一个可靠的校验和函数,可以正确处理Scapy(,GPLv2)中的端点问题

在Python 2.7中,scapy的utils.py:

if struct.pack("H",1) == "\x00\x01": # big endian
    def checksum(pkt):
        if len(pkt) % 2 == 1:
            pkt += "\0"
        s = sum(array.array("H", pkt))
        s = (s >> 16) + (s & 0xffff)
        s += s >> 16
        s = ~s
        return s & 0xffff
else:
    def checksum(pkt):
        if len(pkt) % 2 == 1:
            pkt += "\0"
        s = sum(array.array("H", pkt))
        s = (s >> 16) + (s & 0xffff)
        s += s >> 16
        s = ~s
        return (((s>>8)&0xff)|s<<8) & 0xffff
如果struct.pack(“H”,1)=“\x00\x01”:
def校验和(pkt):
如果len(pkt)%2==1:
pkt+=“\0”
s=总和(数组.array(“H”,pkt))
s=(s>>16)+(s&0xffff)
s+=s>>16
s=~s
返回s&0xffff
其他:
def校验和(pkt):
如果len(pkt)%2==1:
pkt+=“\0”
s=总和(数组.array(“H”,pkt))
s=(s>>16)+(s&0xffff)
s+=s>>16
s=~s

return((s>>8)&0xff)|当您查看
hashlib
的文档时,您看到了什么?我想知道如何将函数checksum中的w行更改为w=(ord(msg[I])@Jason,函数checksum中需要什么输入类型?请注意,此checksum函数假定输入“msg”的长度参数的长度为偶数。奇数长度输入会出现异常。惯用的解决方案是在校验和计算期间使用pad字节,该字节不会作为数据包的一部分传输。(例如,在校验和函数中,检查msg是否为奇数长度,如果是,则重新将msg分配给:msg+=“\x00”。)
if struct.pack("H",1) == "\x00\x01": # big endian
    def checksum(pkt):
        if len(pkt) % 2 == 1:
            pkt += "\0"
        s = sum(array.array("H", pkt))
        s = (s >> 16) + (s & 0xffff)
        s += s >> 16
        s = ~s
        return s & 0xffff
else:
    def checksum(pkt):
        if len(pkt) % 2 == 1:
            pkt += "\0"
        s = sum(array.array("H", pkt))
        s = (s >> 16) + (s & 0xffff)
        s += s >> 16
        s = ~s
        return (((s>>8)&0xff)|s<<8) & 0xffff