delsum delsum是一個CLI應用程序,用於查找文件中使用的校驗和。
目前有三個子命令:
check :給定校驗和算法的規範和文件列表,這只會輸出這些文件的校驗和。part :給定校驗和算法的規範和帶有相應校驗和的文件列表,這找到了具有給定校驗和的文件的一部分reverse :給定一個帶有相應校驗和的文件列表,這找到了使用的校驗和參數check此子命令通過給定算法計算校驗和。
例子:
$ delsum check -m 'crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true' file_a file_b file_c
700b14f5,e1207917,79741cb2
可以將算法直接指定為使用-m的參數,也可以在文件中提供算法列表。
計算校驗和的範圍的開始或結束是用-S或-E給出的,並且也可能是負面的,以使其相對於末端。例如,為了計算除最後兩個字節以外的所有字節的校驗和,一個指定-S 0和-E-3 (它是包含的,因此-3仍然是總和的一部分)。
有關可用算法以及如何指定它們,請參見此處。
part該子命令找到所有給定的校驗和匹配的文件列表的所有部分。匹配的文件部分必須是相同的文件。
例子:
$ delsum part -m 'modsum width=16 module=ffff' -c 1234,5678,abcd file_a file_b file_c
modsum width=16 module=ffff:
0x8:-0x3
在這種情況下,校驗和在零件0x8:-0x3中匹配,其中-0x3是相對的。這是一個包容性的範圍,這意味著從開始到結束的校驗和將具有0x0:-0x1範圍。如果文件分別為15、16和18個字節,則該輸出意味著
file_a具有從字節8到13的校驗和1234file_b具有從字節8到14的校驗和5678file_c具有從字節8到16的校驗abcd通過使用-s標誌,從文件的開頭(而不是末端),也可以使零件的末端是相對的。此外, -S和-E允許一個人通過指定範圍(也包含)來約束範圍開始和結束的地方。例如,當正常情況下,將輸出0x1:0xa , 0x3:0x10和0x4:0xb ,指定-S0x0:0x3只能允許範圍的啟動部分在0和3包含範圍之間,因此不打印0x4 。這可以幫助避免誤報,還可以減少執行時間。
它很可能會輸出輸出諸如0x1,0x6:0x5,0x10的輸出。這只是意味著每種組合都是可能的。在這種情況下,將具有0x1:0x5 0x1:0x10和0x6:0x10 。儘管從理論上講, 0x6:0x5也是一個選擇,但它不是有效的,因為它是向後的。
通過利用校驗和的線性性,可以在大致上進行登錄時間完成整個過程,但請記住,它在頭頂上有一個很大的(線性)空間,如果您在一堆500MB文件上運行它,則可能會用盡內存。
一個人還可以將文件中的算法列表作為-M的輸入。這可能很有用,因為它可以簡單地將最常見的校驗和算法放入其中,並查看文件中任何部分中的任何算法是否具有所需的校驗和。有關可用算法以及如何指定它們,請參見此處。
reverse該子命令找到了校驗和算法的參數。
使用給定的文件和校驗和搜索,它搜索了整個文件具有給定校驗和的算法參數。
請注意,至少必須指定基本算法和校驗和寬度的寬度(例如, crc width=32 )。有關可用算法以及如何指定它們,請參見此處。
例子:
$ delsum reverse -m 'crc width=32' -c 700b14f5,e1207917,79741cb2 file_a file_b file_c
crc width=32 poly=0x4c11db7 init=0xffffffff xorout=0xffffffff refin=true refout=true
通常,您需要3個文件,對於modsum以外的算法,至少一個文件需要具有不同的長度。還可以指定算法的某些參數(例如,使用-m 'crc width=32 init=0' ),該參數需要更少或產生較少的誤報。
如果您只有一個給定長度的文件,但也只關心該長度的校驗和,對於算法而非modsum則可以簡單地設置init=0 。
通常很快;例如,在大多數情況下,CRC逆轉算法的運行時間圍繞O(n*log^2(n)*log(log(n)))其中n是filesize,這要歸功於在NTL和GF2X庫中實現的快速GCD算法。
對於某些參數,僅搜索了可能的組合:
wordsize尺寸的2個倍數的8個倍數,該倍數較小或等於widthrefin和refout搜索refin = refout要搜索這些參數,請手動指定它們,或使用--extended-search CLI參數。
目前有三個算法系列: modsum , fletcher和crc 。它們是這樣指定的: algofamiliy width=123 para1=ff para2=true para3=10 name="algoname" 。請注意,除width和wordsize以外的所有數值參數都在十六進制中。
目前,這些是所有類型的共享類型:
width :校驗和寬度的寬度out_endian :校驗和的Endian,可以little或bigwordsize :輸入文本中的單詞位數。必須是8和8到64之間的倍數。例如,在簡單的校驗和中,使用wordsize=16將文件切入16位整數中,並將它們添加到modulo module中。in_endian :輸入詞的結尾可以little或big 。modsum帶有參數width , init和module簡單模塊總和。
對應於
sum = init
for byte in file:
sum = (sum + byte) % module
return sum
請注意,對於0的module ,它等效於2^width 。
module和init的默認值均為0。
fletcher帶有參數width , init , addout , module和swap弗萊徹(Fletcher)總和。
對應於
sum1 = init
sum2 = 0
for byte in file:
sum1 = (sum1 + byte) % module
sum2 = (sum2 + sum1) % module
sum1 = (sum1 + addout.sum1) % module
sum2 = (sum2 + addout.sum2) % module
if not swap:
returm (sum2 << (width/2)) | sum1
else:
returm (sum1 << (width/2)) | sum2
它以“包裝”形式輸出,其中sum1存儲在較低的寬度/2位,而sum2則在較高的寬度/2中(或啟用swap時相反)。參數是:
width :整個包裝校驗和的寬度。強制的。module :減少的值。 module = 0表示2^(width/2) ,是默認值。init :使用常規校驗和初始化的價值。默認為0。addout :在總和末尾添加的包裝值。不管swap如何,末尾總是將高部分添加到校驗和的高部分中。默認為0。swap :布爾旗,表明常規總和應在包裝校驗和的較高的一半中。默認為false 。crc根據“無痛指南CRC錯誤檢測指南”中記錄的具有參數的CRC算法。
它具有以下參數:
width :校驗和程度的位寬度(Poly的程度)。強制的。poly :發電機多項式,正常符號。強制性( reverse除外)。init :CRC狀態的初始值。默認為0。xorout :XOR到總和的最終值。默認為0。refin :布爾標誌,指示是否反映輸入字節的位。默認為false 。refout :在添加xorout之前,指示是否要反射最終校驗和的位。默認為false 。請注意,用in_endian=little (標準)的其他wordsize值與在計算wordsize=8 charchsum之前交換每個單詞wordsize位中的字節相同。
此處找到了所使用算法的某些(不完整的)解釋。
這裡有一個Linux構建,其中包含NTL庫,但請記住,它是在沒有大多數現代X86擴展的情況下進行編譯的,因此無法利用gf2x中一些優化的例程,這使得CRC逆轉速度更快。我也太愚蠢了,無法做一個窗戶構建,很抱歉。
該程序針對NTL , gf2x和gmp鏈接。
如果您正在使用Debian的系統,則可以將其安裝
apt-get install libgmp-dev libgf2x-dev libntl-dev
您也可以自己編譯,請參閱此處。這通常會成為最快的二進製文件,因為可以使用指令集擴展名,並且還可以調整算法參數。
如果您安裝了cargo
cargo install --path .
或者,沒有下載存儲庫,
cargo install delsum
如果要靜態地鏈接NTL庫,則可以在運行cargo時設置環境變量DELSUM_STATIC_LIBS=1 。
該項目的代碼是根據MIT許可證獲得許可的。