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许可证获得许可的。