循環冗余校驗碼簡稱CRC碼,是目前使用非常廣泛的數據校驗方式.它不僅能校驗傳遞過來的數據正確性,還能篩查出哪一位出現了錯誤.它的局限性是只能校驗一位
數據發生跳變,在現實世界當中數據發生跳變很大很大的概率只有一位發生變化,因此CRC碼也擁有很大的發揮舞台.
循環冗余校驗碼的定義與編碼方法
用待校驗的數據,除以某個約定代碼,能除盡說明數據正常,否則通過循環位移校正出錯為
視頻學習-->中國大學MOOC 《計算機組成原理》
https://www.icourse163.org/learn/UESTC-1001543002?tid=1460688446#/learn/content?type=detail&id=1236902185&cid=1256678353
編碼方法
1.將待編碼的k位有效數據M(x)左移r位,得到全編碼多項式M(x)*xr,空出r位,以裝填r位余數
2.選取一個r+1位的生成多項式G(x),對M(x)*xr進行模2除運算,得到商Q(x)和余數R(x)的代碼
3.將左移r位的待編碼信息,與余數R(x)模2加,可拼接為包含有效數據在內的CRC編碼
用舉例的方法來解釋:
不同CRC標准
不同的標准采用的Q(x)不同
CRC4:x4+x+1
CRC8: x8+x5+x4+1
CRC16: x16+x12+x5+1
CRC32: x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
png圖片格式
先來看一個正常png圖片的開始部分
89 50 4E 47 0D 0A 1A 0A
png文件頭
00 00 00 0D
文件頭數據塊表示IDCH
49 48 44 52
IHDR 文件頭數據塊
00 00 03 84
寬度
00 00 01 7F
高度
08 06 00 00 00
每一位依次表示 圖像深度, 顏色類型, 壓縮方法, 濾波器方法,隔行掃描方法
11 84 07 C8
CRC32校驗碼
png圖片IHDR部分的CRC校驗碼,是根據IDCH和IHDR數據計算出來的,即計算00 00 00 0D 49 48 44 52 00 00 03 84 00 00 01 7F 08 06 00 00 00
的CRC校驗碼
如果修改了圖片的寬高,沒有修改CRC編碼,那么可以通過計算發現CRC編碼不一致。010 editor在打開圖片時會檢查CRC校驗碼,如果有問題會提醒。
可以使用python zlib庫中的函數計算CRC校驗值
import zlib
with open('1.png','rb') as image_data:
bin_data=image_data.read()
data = bytearray(bin_data[12:29])#截取待計算的字符串
crc32key = zlib.crc32(data)#使用函數計算
print(hex(crc32key))
根據CRC校驗值暴力破解png圖片正確的寬高
由於CRC32只能對一位數據出錯做出校正,而修改寬高時涉及的數據不一定只用一位,所以可以采取的辦法只有枚舉png圖片的寬高,然后計算修改后圖片的CRC值,與正確的CRC值比較看是否一致
從別的大佬博客里獲得的腳本
import zlib
import struct
filename = '2.png'
with open(filename, 'rb') as f:
all_b = f.read()
crc32key = int(all_b[29:33].hex(), 16)
data = bytearray(all_b[12:29])
n = 4095 # 理論上0xffffffff,但考慮到屏幕實際/cpu,0x0fff就差不多了
for w in range(n): # 高和寬一起爆破
width = bytearray(struct.pack('>i', w)) # q為8字節,i為4字節,h為2字節
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x + 4] = width[x]
data[x + 8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
# 2021.7.20,有時候顯示的寬高依然看不出具體的值,干脆輸出data部分
print(data.hex())
print("寬為:", end="")
print(width)
print("高為:", end="")
print(height)
exit(0)
參考文獻
png圖片crc32爆破寬和高:https://moddemod.blog.csdn.net/article/details/103787186
png文件格式詳解:https://www.cnblogs.com/mengfanrong/p/3801583.html