checksum 算法
常见校验算法范文

常见校验算法范文1. 校验和算法(CheckSum Algorithm):校验和算法是一种简单的校验方法,它将数据中的每个字节相加并取结果的低8位作为校验和。
接收方将接收到的数据进行相同的计算,并将计算结果与发送端发送的校验和进行比对,如果一致则数据传输正确。
2. CRC(Cyclic Redundancy Check):循环冗余校验是一种更复杂的校验算法,它通过使用多项式除法来计算校验值。
CRC算法使用一个固定的除数,将给定的数据按位进行除法操作,得到的余数就是CRC校验值。
接收方同样使用相同的除数对数据进行计算,并将计算结果与发送端发送的校验值进行比对,如果一致则数据传输正确。
CRC算法能够更有效地检测错误,并且能够校正一些错误。
3. MD5(Message Digest Algorithm 5):MD5是一种常用的消息摘要算法,它将任意长度的输入消息转换为128位的输出摘要。
MD5算法基于非线性的复杂计算,并且无法根据摘要反推出原始输入数据。
MD5算法常用于文件完整性校验和密码存储等场景。
4. SHA(Secure Hash Algorithm):SHA系列算法是消息摘要算法的一种,它包括SHA-1、SHA-224、SHA-256、SHA-384和SHA-512等不同的变种。
SHA算法能够将任意长度的输入消息转换为固定长度的输出摘要,常用于数字签名、数据完整性校验和身份验证等场景。
5. HMAC(Hash-based Message Authentication Code):HMAC是一种基于哈希函数的消息认证码算法,它能够对数据进行完整性和原始性的验证。
HMAC算法使用一个密钥对消息进行加密,并生成消息认证码。
接收方使用相同的密钥进行解密和计算,然后将计算结果与接收到的消息认证码进行比对,如果一致则数据传输正确。
6. RSA(Rivest-Shamir-Adleman):RSA是一种非对称加密算法,常用于数据的加密和数字签名。
checksum计算方法

checksum计算方法
Checksum 的计算方法可以分为两种,分别是校验和法和循环冗余校验法。
1. 校验和法:
在计算机网络中,校验和是一种简单的差错检测方法。
校验和算法是将数据进行按位加和,并将结果存储在一个检验和字段中,接收方在接收数据后重新计算校验和并与发送方计算的校验和进行比较,以判断数据是否出现错误。
具体计算方法:
先将数据分成若干个16位的部分,每个部分相加。
如果计算出来的结果超过了16位,则将高位和地位相加,直到结果不超过16位为止。
最后将得到的结果取反,得到校验和。
2. 循环冗余校验法(CRC):
循环冗余校验法是一种更加复杂的差错检测方法,广泛用于数据通信中的数据错误检测和纠正。
CRC算法的核心是通过一个固定的生成多项式对数据进行除法运算,所得的余数作为校验码。
接收方收到数据后,按照同样的生成多项式进行除法运算,如果得到的余数为0,则认为数据传输正常,否则认为数据传输出现错误。
具体计算方法:
假设数据长度为n个字节,除数(生成多项式)的长度为m个字节。
将n个字节的数据左移出m-1个比特位,然后与m字节的生成多项式进行异或运算。
将运算结果与余下的数据再左移出m-1个比特位,重复上述操作,直到余下的数据的长度小于m字节。
最后得到的余数即为校验码。
注意,CRC算法中生成多项式的选择对于校验的可靠性具有决定性意义。
checksum算法

checksum算法
checksum的计算方法
1、先将需要计算checksum数据中的checksum设为0;
2、计算checksum的数据按2byte划分开来,每2byte组成一个16bit 的值,如果最后有单个byte的数据,补一个byte的0组成2byte;
3、将所有的16bit值累加到一个32bit的值中;
4、将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff,
再将新值的高16bit与低16bit相加;
5、将上一步计算所得的16bit值按位取反,即得到checksum值,存入数据的checksum字段即可
计算例子:
如计算下面一段数据的checksum,数据为16进制;
45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11
红色的6d 36为checksum字段,先把checksum设0,数据分组,补0,整理完后数据如下,中间checksum设置为0,最后补1byte 0;4500 003c 0000 0000 4011 0000 c0a8 2bc3 0808 0808 1100
计算:4500+003c+0000+0000+4011+0000+c0a8+2bc3+0808+0808+1100 = 192C8
高低16bit相加:1 + 92C8 = 92C9
取反:~92C9 = 6D36
最后所得数据为:45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11。
checksum 算法

checksum 算法Checksum算法是一种用于检验数据传输是否出现错误的方法。
在数据传输过程中,由于各种原因,比如干扰、噪声等,数据可能会发生变化或损坏。
而Checksum算法可以通过计算数据的校验和来判断数据是否出错,从而保证数据的准确性和完整性。
Checksum算法的原理是将数据划分为多个等长的区块,然后对每个区块进行运算,得到一个校验和。
校验和的计算方法可以有很多种,常见的有加法校验和、循环冗余校验(CRC)等。
这里以加法校验和为例进行说明。
加法校验和是一种简单的Checksum算法,它的计算过程是将数据中的每个字节都相加,然后取结果的低字节作为校验和。
例如,对于数据“hello”,我们可以将其转换为ASCII码形式进行计算,即104 + 101 + 108 + 108 + 111 = 532,取532的低字节20作为校验和。
在数据传输过程中,发送方会将数据和校验和一起发送给接收方。
接收方在接收到数据后,也会对数据进行校验和计算,然后将计算得到的校验和与接收到的校验和进行比较。
如果两者相同,则说明数据传输没有出错;如果不同,则说明数据传输出现了错误。
Checksum算法虽然简单,但是具有一定的容错能力。
通过计算校验和,可以快速判断数据是否出错,从而及时进行纠错或重新传输。
然而,Checksum算法也有一些局限性。
首先,它只能检测出数据是否出错,而无法确定具体出错的位置或原因。
其次,Checksum算法并不能100%保证数据的准确性,仍然存在一定的错误率。
为了提高数据传输的准确性和安全性,Checksum算法通常会与其他校验方法一起使用。
比如,在网络通信中,常常会将Checksum算法与循环冗余校验(CRC)算法相结合,以提高数据校验的可靠性。
CRC算法通过生成多项式除法来计算校验值,具有更高的错误检测能力。
除了数据传输领域,Checksum算法还广泛应用于文件校验、数据校验和数据完整性验证等领域。
checksum 算法

checksum 算法Checksum算法,又称校验和算法,是一种常用的数据校验方法。
它能够通过计算数据的校验和,来判断数据是否在传输或存储过程中发生了错误或损坏。
本文将介绍Checksum算法的原理、应用场景以及常见的实现方法。
一、Checksum算法的原理Checksum算法的原理基于对数据进行求和或求异或运算来生成校验和。
在数据传输或存储过程中,发送方使用Checksum算法对数据进行计算,并将生成的校验和附加在数据帧或数据包的尾部。
接收方在接收数据时,同样使用Checksum算法对数据进行计算,并与接收到的校验和进行比较。
如果计算得到的校验和与接收到的校验和相同,说明数据未发生错误或损坏;如果不同,则说明数据发生了错误或损坏。
二、Checksum算法的应用场景Checksum算法在计算机网络、存储系统、操作系统等领域都有广泛的应用。
以下是一些常见的应用场景:1. 数据传输:在网络通信中,Checksum算法被用来检测数据包是否在传输过程中被篡改或损坏。
接收方可以通过计算校验和来判断数据是否完整和正确。
2. 数据存储:在磁盘或存储系统中,Checksum算法被用来检测数据是否在存储过程中发生了位错误或损坏。
存储系统可以通过计算校验和来发现并纠正这些错误。
3. 文件完整性验证:Checksum算法可以用来验证文件的完整性。
例如,下载文件时可以计算文件的校验和,并与提供的校验和进行比较,以确保文件未被篡改或损坏。
三、Checksum算法的实现方法Checksum算法有多种实现方法,下面介绍两种比较常见的实现方法:1. 求和算法:求和算法是Checksum算法中最简单的一种实现方法。
它通过将数据中所有字节的值相加,再取补码作为校验和。
接收方在接收数据时,同样将所有字节的值相加,再取补码,然后与接收到的校验和进行比较。
2. 异或算法:异或算法是Checksum算法中另一种常见的实现方法。
它通过将数据中所有字节的值依次进行异或运算,得到的结果作为校验和。
解析IPV4报文和IPV6报文的checksum的算法

解析IPV4报文和IPV6报文的checksum的算法:校验和(checksum)算法,简单的说就是16位累加的反码运算:计算函数如下:我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。
UINT32 Checksum(UINT32 cksum, VOID *pBuffer, UINT32 size){INT8 num = 0;UINT8 *p = (UINT8 *)pBuffer;if ((NULL == pBuffer) || (0 == size)){returncksum;}while (size > 1){cksum += ((UINT16)p[num] << 8 & 0xff00) | (UINT16)p[num + 1] & 0x00FF;2个字节累加,先取网络字节序低位左移8位(变成主机字节序高位),与(加)上网络字节序中的高位(主机字节序地位),即网络字节序要先变成主机字节序在进行累加, size -= 2;num += 2;}if (size > 0)如果长度为奇数{cksum += ((UINT16)p[num] << 8) & 0xFFFF;如果总的字节数为奇数,则最后一个字节单独相加num += 1;}while (cksum>> 16){cksum = (cksum& 0xFFFF) + (cksum>> 16);累加完毕将结果中高16位再加到低16位上,重复这一过程直到高16位为全0}returncksum;}注意:UINT32 cksum的类型,这里是4个字节的,防止在累加的过程中,数据溢出,(例如0xFF累加时就会内存溢出)详细的计算过程和原理如下一:ip头的计算:直接对头部数据进行累加(不包括原来的checksum值):1、ipv4包头ipHeadLen = (pIpHeader->ver_ihl& 0x0F) << 2;在ipv4头中,版本类型和头长度加在一起是1个字节(8位),各占4位,版本类型在前,长度在后,所以要取长度只能取低4位,pIpHeader->chksum = 0;因为不包括原来的checksum值,所以在每次计算前先把checksum的值置0,然后计算 sum = Checksum(0, (VOID *)pIpHeader, ipHeadLen);对整个ip包头的累加pIpHeader->chksum = HTONS((UINT16)(~sum));结果为计算值的反码,(别忘转化为网络字节序)2、ipv6包头在ipv6中已经省略了checksum部分,但在后面的部分要有的,比如TCP/UDP包,别高兴的太早二、TCP/UDP报文的计算(举例UDP):这里的checksum包含两部分,一部分是伪头的累加,还有一部分是UDP包的累加(不包括原来的checksum值)伪头有分ipv4和ipv6两种,分别包含如下几部分,这里做下比较1、 ipv4类型的:第一部分,伪头部分的计算:sum = 0;udpLen =sizeof(UDP_HEADER_T) + dhcpLen;UDP的长度= UDP的包头长度+ UDP的数据长度sum += udpLen;或者,下面也是一样的,这里就是网络字节序和主机字节序的区别了,上面的是(主机字节序)直接累加,下面的是网络字节序,一定要变成主机字节序后累加pUdpHeader->len = HTONS(udpLen);主机字节序转化为网络字节序,存入数据包中,一定要注意,我们做的所有累加也是网络字节序,这里一定要搞清楚,以防混淆搞错了sum += (pUdpHeader->len>> 8 & 0x00FF);2个字节的累加,先取网络字节序的高位,右移8位,变成主机字节序的低位,累加sum += (pUdpHeader->len<< 8 & 0xFF00);在取网络字节序的低位,左移8位,变成主机字节序的高位,累加sum = Checksum(sum, (VOID *)&pIpHeader->saddr, 4);sum = Checksum(sum, (VOID *)&pIpHeader->daddr, 4);对4位的地址进行累加sum += ((UINT16)pIpHeader->proto & 0x00FF);对1位的协议类型进行累加伪头部分计算完成第二部分,UDP数据包的计算pUdpHeader->chksum = 0;注意:每次计算前别忘先把checksum的值置0,然后计算sum = Checksum(sum, (VOID *)pUdpHeader, udpLen);对整个UDP包的累加pUdpHeader->chksum = HTONS((UINT16)(~sum));结果为计算值的反码,(别忘转化为网络字节序)UDP数据包部分计算完成2、 ipv6类型的:第一部分,伪头部分的计算:sum = 0;udpLen =sizeof(UDP_HEADER_T) + dhcpLen;sum += udpLen;或者pUdpHeader->len = HTONS(udpLen);sum += (pUdpHeader->len>> 8 & 0x00FF);sum += (pUdpHeader->len<< 8 & 0xFF00);sum = Checksum(sum, (VOID *)&pIpHeader->saddr, 16); sum = Checksum(sum, (VOID *)&pIpHeader->daddr, 16); 对16位的地址进行累加sum += ((UINT16)pIpHeader->proto & 0x00FF); 伪头部分计算完成第二部分,UDP数据包的计算pUdpHeader->chksum = 0;注意:每次计算前别忘先把checksum的值置0,然后计算sum = Checksum(sum, (VOID *)pUdpHeader, udpLen);对整个UDP包的累加pUdpHeader->chksum = HTONS((UINT16)(~sum)); 结果为计算值的反码,(别忘转化为网络字节序)UDP数据包部分计算完成。
信息校验算法

信息校验算法
信息校验算法是一种用于检测数据完整性和准确性的技术。
常见的校验算法包括:
1. Checksum:一种简单的校验算法,通过将数据中的每个字节相加,然后取结果的最低有效字节,来检测数据是否在传输过程中发生了变化。
2. 奇偶校验:通过在数据中添加一个额外的位,使得整个数据(包括校验位)中的1的个数是偶数(偶校验)或奇数(奇校验)。
如果数据中的任何位发生变化,奇偶校验位的值也会发生变化,从而检测出错误。
3. 海明码校验:一种线性分组码,用于检测数据中的错误。
它将数据分成多个部分,并为每一部分添加冗余信息。
通过使用多个校验公式,海明码可以在多个位置检测到错误。
4. 循环冗余校验(CRC):一种用于检测错误的技术,它通过将数据视为多项式并计算其系数,然后添加一个额外的多项式作为校验码。
接收方使用相同的算法重新计算校验码,并与发送方的校验码进行比较。
如果两者匹配,则数据被认为是正确的;否则,数据被认为是有错误的。
5. 哈希算法:一种将任意大小的数据映射为固定大小散列值的算法。
常见的哈希算法包括MD系列和SHA系列。
哈希算法常用于验证数据的完整性和一致性,因为相同的输入总是产生相同的输出。
这些校验算法在不同的应用场景中都有其优势和局限性。
选择哪种算法取决于数据的性质、所需的错误检测能力以及计算和存储资源等因素。
checksum计算方法

ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段。
ICMP和IP报头校验和的计算都很简单,使用RFC1071中给出的方法即可完成(如下)。
//计算校验和USHORT checksum(USHORT *buffer,int size){unsigned long cksum=0;while(size>1){cksum+=*buffer++;size-=sizeof(USHORT);}if(size){cksum+=*(UCHAR *)buffer;}//将32位数转换成16while (cksum>>16)cksum=(cksum>>16)+(cksum & 0xffff);return (USHORT) (~cksum);}UDP/TCP报头中的校验和的计算比较复杂的,要用到 UDP/TCP伪首部:先要填充伪首部各个字段,然后再将UDP/TCP报头以后(包括报头)的数据附加到伪首部的后面,再对位首部使用上述校验和计算,所得到的值才是UDP/TCP报头部分的校验和。
位首部可以用如下的结构体表示:typedef struct{ULONG sourceip; //源IP地址ULONG destip; //目的IP地址BYTE mbz; //置空(0)BYTE ptcl; //协议类型USHORT plen; //TCP/UDP数据包的长度(即从TCP/UDP报头算起到数据包结束的长度单位:字节)}Psd_Header;这个过程是一个很繁琐的过程,计算过几次后再也忍受不了做这样重复的工作,于是写了一个通用的计算函数。
这个函数使用起来我感觉非常方便:先封装好你的数据包(完整的,包括以太头),然后将数据包的首地址作为参数,调用该函数即可。
函数将帮你完成IP报头以及UDP/TCP报头部分校验和的计算。
//————————————————————————-// PacketCheckSum// 计算数据包的校验和// 参数:packet-待处理数据(将封装好的数据包的指针)//————————————————————————-void PacketCheckSum(unsigned char packet[]){Dlc_Header *pdlc_header=NULL; //以太头指针Ip_Header *pip_header=NULL; //IP头指针unsigned short attachsize=0; //传输层协议头以及附加数据的总长度pdlc_header=(Dlc_Header *)packet;//判断ethertype,如果不是IP包则不予处理if(ntohs(pdlc_header->ethertype)!=0×0800) return;pip_header=(Ip_Header *)(packet+14);//TCP包if(0×06==pip_header->proto){Tcp_Header *ptcp_header=NULL; //TCP头指针Tcp_Psd_Header *ptcp_psd_header=NULL;ptcp_header=(Tcp_Header *)(packet+14+((pip_header->ver_len)&15)*4); attachsize=ntohs(pip_header->total_len)-((pip_header->ver_len)&15)*4;ptcp_psd_header=(Tcp_Psd_Header *)malloc(attachsize+sizeof(Tcp_Psd_Header)); if(!ptcp_psd_header) return;memset(ptcp_psd_header,0,attachsize+sizeof(Tcp_Psd_Header));//填充伪TCP头ptcp_psd_header->destip=pip_header->destIP;ptcp_psd_header->sourceip=pip_header->sourceIP;ptcp_psd_header->mbz=0;ptcp_psd_header->ptcl=0×06;ptcp_psd_header->tcpl=htons(attachsize);//计算TCP校验和ptcp_header->chksum=0;memcpy((unsigned char *)ptcp_psd_header+sizeof(Tcp_Psd_Header),(unsigned char *)ptcp_header,attachsize);ptcp_header->chksum=checksum((unsigned short *)ptcp_psd_header,attachsize+sizeof(Tcp_Psd_Header));//计算ip头的校验和pip_header->checksum=0;pip_header->checksum=checksum((unsigned short *)pip_header,20);return;}//UDP包if(0×11==pip_header->proto){Udp_Header *pudp_header=NULL; //UDP头指针Udp_Psd_Header *pudp_psd_header=NULL;pudp_header=(Udp_Header *)(packet+14+((pip_header->ver_len)&15)*4); attachsize=ntohs(pip_header->total_len)-((pip_header->ver_len)&15)*4;pudp_psd_header=(Udp_Psd_Header *)malloc(attachsize+sizeof(Udp_Psd_Header)); if(!pudp_psd_header) return;memset(pudp_psd_header,0,attachsize+sizeof(Udp_Psd_Header));//填充伪UDP头pudp_psd_header->destip=pip_header->destIP;pudp_psd_header->sourceip=pip_header->sourceIP;pudp_psd_header->mbz=0;pudp_psd_header->ptcl=0×11;pudp_psd_header->udpl=htons(attachsize);//计算UDP校验和pudp_header->chksum=0;memcpy((unsigned char *)pudp_psd_header+sizeof(Udp_Psd_Header),(unsigned char *)pudp_header,attachsize);pudp_header->chksum=checksum((unsigned short *)pudp_psd_header,attachsize+sizeof(Udp_Psd_Header));//计算ip头的校验和pip_header->checksum=0;pip_header->checksum=checksum((unsigned short *)pip_header,20);return;}return;}需要几个头文件,以及库:#include <winsock2.h>#include <windows.h>#include “packet.h”#pragma comment(lib,”ws2_32.lib”)如果要自己填充IP数据报,那么计算Checksum是必不可少的一步,算法如下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
checksum 算法
Checksum算法是一种用于校验数据完整性的算法。
它通过对数据进行计算,生成一个校验值,然后将该校验值与数据一同传输或存储。
接收方在收到数据后,再次计算校验值,与传输过来的校验值进行比较,以判断数据是否在传输过程中发生了错误或损坏。
Checksum算法的原理很简单,它通过对数据中每个字节进行运算,得到一个校验和。
一般来说,校验和是一个字节长的值,它可以是累加和、异或和或者更复杂的算法。
在数据传输或存储时,发送方将数据和校验和一同发送,接收方在接收到数据后,再次计算校验和,与接收到的校验和进行比较。
如果两者相同,则说明数据完整无误;如果不同,则说明数据在传输过程中发生了错误或损坏,需要进行相应的处理。
Checksum算法的应用非常广泛。
在计算机网络中,Checksum算法常用于校验传输层协议(如TCP和UDP)中的数据包是否完整。
在存储设备中,Checksum算法可以用于校验硬盘或闪存中存储的数据是否正确。
在文件传输中,Checksum算法可以用于校验文件的完整性,以确保文件在传输过程中没有发生错误或损坏。
Checksum算法具有很多优点。
首先,它非常简单,计算速度快。
其次,Checksum算法可以很好地检测出数据的错误或损坏。
尽管Checksum算法无法纠正错误,但它可以通过重新传输或采取其他措施来处理错误。
此外,Checksum算法还可以通过增加校验位的长度
来提高数据校验的可靠性。
然而,Checksum算法也有一些局限性。
首先,Checksum算法无法检测出数据内容的改变。
如果数据在传输过程中被恶意篡改,Checksum算法无法发现这种情况。
其次,Checksum算法无法检测出数据中的重复、遗漏或顺序错误。
因此,在某些应用场景下,需要使用更复杂的校验算法来确保数据的完整性。
总的来说,Checksum算法是一种简单而有效的数据校验算法。
它可以用于校验数据在传输或存储过程中是否发生了错误或损坏。
虽然Checksum算法无法纠正错误或检测数据内容的改变,但它仍然是广泛应用于计算机网络、存储设备和文件传输等领域的重要算法。
在实际应用中,我们可以根据具体的需求选择合适的Checksum算法,并合理设计校验位的长度,以提高数据校验的可靠性和安全性。