Checksum校验和的原理和python脚本的实现

版权声明:转载请声明( ̄▽ ̄) https://blog.csdn.net/qq_41079177/article/details/89160887

checksum校验和简介

checksum是小尺寸的数据从一个块导出的数字数据为目的的检测错误,可能其期间已经被引入传输或存储。它通常在从下载服务器接收到安装文件后应用于安装文件。校验和本身通常用于验证数据完整性,但不依赖于校验数据的真实性。

从数据输入产生校验和的实际过程称为校验和函数或校验和算法。根据其设计目标,良好的校验和算法通常会输出显着不同的值,即使对输入进行的小改动也是如此。加密散列函数尤其如此,它可用于检测许多数据损坏错误并验证整体数据完整性 ; 如果当前数据输入的计算校验和与先前计算的校验和的存储值匹配,则数据未被意外地改变或损坏的可能性非常高。

校验和函数与散列函数,指纹,随机函数和加密散列函数有关。但是,每个概念都有不同的应用,因此具有不同的设计目标。例如,返回字符串开头的函数可以提供适合某些应用程序的散列,但永远不会是合适的校验和。校验和在较大的身份验证算法中用作加密原语。对于具有这两个特定设计目标的加密系统,请参阅HMAC。

校验位和奇偶校验位是校验和的特殊情况,适用于小块数据(例如社会保险号,银行帐号,计算机字,单字节等)。一些纠错码基于特殊校验和,不仅可以检测常见错误,还可以在某些情况下恢复原始数据。

win环境下产生校验和的方法

Get-Hashfile 文件路径 -Algorithm 校验类型(MD5,SHA256....)

在这里插入图片描述

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的代码实现

import os
if __name__ == '__main__':
    fd = open("12.txt", 'r')
    checksum = 0
    ind = 0
    for (num, line) in enumerate(fd):
        if num > 10:
            break
        for start in range(0, len(line), 2):
            if 106 == ind or 107 == ind or 112 == ind:
                ind += 1
                continue
            if start >= len(line) - 2:
                break
                # print '%s:%d' %(line[start:start+2], int(line[start:start+2], 16))
            checksum = long(
                ((checksum << 31) & 0xFFFFFFFF) | ((checksum >> 1) & 0xFFFFFFFF) + long(line[start:start + 2], 16))
            print 'sector:%d, byte:%d, checksum:%08x' % (num, ind, checksum)
            ind += 1
    print '%08x' % checksum

猜你喜欢

转载自blog.csdn.net/qq_41079177/article/details/89160887