문제 분석
비밀번호를 알아내면 문제를 풀 수 있을 거 같다.
소스코드를 보면 10000000에서 99999999 사이의 임의의 수와 문자열 “salt_for_you”을 합치고 sha1으로 500번 암호화 하고 있다.
해시값을 보고 랜덤값을 알아내면 문제를 해결할 수 있다.
문제 풀이
sha1은 수학적으로 취약점이 발견되었으나 그것을 이용해서 문제를 해결하긴 어렵다.
따라서 실제로 500번 해시를 한 리스트를 만들고서 해시값을 대조해서 찾는 방법을 사용해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hashlib
def sha1_500(text):
for i in range(500):
text = hashlib.sha1(text.encode()).hexdigest()
return text
if __name__ == "__main__":
f = open("dict.txt",'w')
for i in range(10000000,20000000):
text = str(i) + "salt_for_you"
f.write(str(i) + ":" + sha1_500(text) + "\n")
print(str(i) + ":" + sha1_500(text))
위의 소스코드와 같이 리스트를 만들 수 있다.
여기서 10000000부터 99999999까지 전부 찾기에는 시간이 오래 걸리므로 1/10만 구해서 시간을 아낄 수 있다.
리스트가 만들어지면 메모장 같은 편집 프로그램에서는 양이 많아 감당할 수 없으므로 grep등의 방법을 이용해서 검색해야한다.
몇 번 시도하다 보면 하나씩 걸리는게 있을 것이다.
이 숫자 뒤에 “salt_for_you”를 붙여서 답을 제출하면 문제를 풀 수 있다.