Checksum校驗和的原理和python腳本的實現

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章