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 Byte 8에서 13의 CheckSum 1234 가지고 있습니다file_b Byte 8에서 14의 Checksum 5678 있습니다file_c Byte 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 파일 크기입니다. 이는 NTL 및 GF2X 라이브러리 내에서 구현 된 빠른 GCD 알고리즘 덕분입니다.
일부 매개 변수의 경우 조합 만 검색 할 수 있습니다.
wordsize width 작거나 같은 8의 2 배의 힘을 검색합니다.refin 및 refout refin = refout 검색합니다 이러한 매개 변수를 검색하려면 수동으로 지정하거나 --extended-search CLI 인수를 사용하십시오.
현재 modsum , fletcher 및 crc 의 세 가지 알고리즘 제품군이 있습니다. algofamiliy width=123 para1=ff para2=true para3=10 name="algoname" 과 같이 지정됩니다. width 와 wordsize 제외한 모든 숫자 매개 변수는 16 진수입니다.
현재 이들은 공유 된 모든 합계 유형입니다.
width : 체크섬의 비트. 비트out_endian : 체크섬의 엔디언, little 또는 big 일 수 있습니다.wordsize : 입력 텍스트에서 단어의 비트 수. 예를 들어, 간단한 체크섬에서는 wordsize=16 사용하면 파일을 16 비트 정수로 자르고 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 있는 플레처와 같은 합.
대응합니다
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 오류 감지에 대한 통증없는 안내서"에 문서화 된 바와 같이 Rocksoft^TM 모델에 따라 매개 변수가있는 CRC 알고리즘.
다음 매개 변수가 있습니다.
width : 체크섬 비트의 너비 (및 폴리도). 필수적인.poly : 정상적인 표기로 발전기 다항식. 필수 ( reverse 제외).init : CRC 상태의 초기 값. 기본값은 0까지.xorout : XOR의 최종 값은 합계입니다. 기본값은 0까지.refin : 입력 바이트의 비트를 반영할지 여부를 나타내는 부울 플래그. 기본값으로 false .refout : xorout 추가하기 전에 최종 체크섬의 비트를 반영할지 여부를 나타내는 부울 플래그. 기본값으로 false . in_endian=little (표준)을 가진 wordsize 의 다른 값은 wordsize=8 체크섬을 계산하기 전에 각 wordsize 비트 그룹의 바이트를 교체하는 것과 동일합니다.
사용 된 알고리즘에 대한 (불완전한) 설명이 여기에 있습니다.
여기에 NTL 라이브러리가 컴파일 된 Linux 빌드가 있지만 대부분의 최신 X86 확장없이 컴파일되므로 gf2x 에서 일부 최적화 된 루틴을 활용할 수 없으므로 CRC를 훨씬 빠르게 반전시킬 수는 없습니다. 나는 또한 Windows 빌드를하기에는 너무 멍청하므로 죄송합니다.
이 프로그램은 NTL , gf2x 및 gmp 와 연결됩니다.
데비안 기반 시스템을 사용하는 경우 설치할 수 있습니다.
apt-get install libgmp-dev libgf2x-dev libntl-dev
당신은 또한 그들 자신을 컴파일 할 수 있습니다. 여기를 참조하십시오. 명령어 세트 확장을 사용할 수 있고 알고리즘 매개 변수를 조정할 수 있으므로 일반적으로 가장 빠른 바이너리를 만듭니다.
cargo 설치 한 경우 프로젝트 디렉토리 루트에서 이것을 컴파일 할 수 있어야합니다.
cargo install --path .
또는 저장소를 다운로드하지 않고
cargo install delsum
NTL 라이브러리를 정적으로 연결하려면 cargo 실행할 때 환경 변수 DELSUM_STATIC_LIBS=1 설정할 수 있습니다.
이 프로젝트의 코드는 MIT 라이센스에 따라 라이센스가 부여됩니다.