여러 조각으로 분할된 data.txt 파일이 있습니다. 원본 파일 data.txt를 만들려면 파일 조각을 올바르게 결합해야 합니다. 조각 이름에 계층 구조가 없기 때문에 어떤 프로그램이 이 작업을 수행할지 모르겠습니다. 하지만 md5sum
data.txt 파일(조각 목록이 나열되어 있음)이 있습니다 . 이 md5sum
파일을 사용하여 조각에서 전체 파일을 복구하려면 어떻게 해야 합니까 ?
답변1
perl -MAlgorithm::Combinatorics=permutations \
-le '$i=permutations(\@ARGV); while ($p=$i->next) { $n++; print "combo$n @$p" }' frag1 frag2 frag3 frag4 \
| while read out a b c d; do cat $a $b $c $d > $out; md5 $out; done
또는 GNU 도구가 있으면 md5sum
대신 그렇게 할 수 있습니다.md5
답변2
조각이 몇 개 있나요? 조각의 모든 순열을 시도해야 하는 것처럼 들리므로(또는 올바른 조각을 찾을 때까지) 상대적으로 적은 수의 조각으로 문제를 해결하면 많은 작업이 발생하게 됩니다.
답변3
일부의 체크섬을 아는 것은 전체의 체크섬을 계산하는 데 도움이 되지 않으므로 올바른 순열을 찾을 때까지 가능한 모든 순열의 체크섬을 계산해야 합니다. 당신이 가지고 있다면N부분이 있어요N! (계승N) 순열, 가능성이 동일하다면 처리해야 합니다.N올바른 것을 찾을 때까지 평균 !/2입니다.
접두사가 동일한 여러 문자열에 대한 체크섬을 계산해야 하는 경우 MD5 함수의 내부 상태를 저장하여 시간을 절약할 수 있습니다. 예를 들어, 세 부분(X, Y, Z)에 대해 MD5(X+Y+Z), MD5(X+Z+Y), MD5(Y+X+Z), MD5(Y +Z+ X), MD5(Z+X+Y) 및 MD5(Z+Y+X). MD5(X,…) 계산을 시작하면 상태를 복사하고 접미사 Y+Z 및 Z+Y 계산을 완료합니다. 그러나 출력이 아닌 내부 상태를 원하며 대부분의 도구는 내부 상태에 대한 액세스를 허용하지 않습니다.
파이썬해시 라이브러리copy
해시 함수의 내부 상태를 복사하는 방법을 제공합니다 . 그것은 또한열거 순열을 위한 반복자표준 라이브러리에 있습니다.
#!/usr/bin/env python2
import hashlib, itertools, sys
def look_for_permutation(goal, filenames):
n = len(filenames)
files = map(open, filenames)
previous = map(lambda _: None, filenames)
states = [hashlib.md5()] + [None] * (n-2)
for current in itertools.permutations(files):
i = 0
while current[i] == previous[i]:
i += 1
state = states[i].copy()
for f in current[i:n-2]:
state.update(f.read())
i += 1
states[i] = state.copy()
f.seek(0)
state.update(current[n-2].read())
current[n-2].seek(0)
state.update(current[n-1].read())
if state.hexdigest() == goal:
return current
current[n-1].seek(0)
previous = current
return None
if __name__ == '__main__':
result = look_for_permutation(sys.argv[1], sys.argv[2:])
if result:
for f in result: print f.name
sys.exit(0)
else:
sys.exit(1)
스크립트는 해시 계산을 최적화하지만 파일 내용을 반복적으로 읽습니다. 파일 내용이 메모리에 맞으면 파일을 한꺼번에 로드하여 작업 속도를 높일 수 있습니다.