본문 바로가기
Python

파이썬을 이용한 간단한 Zip 파일 암호 풀기

by 아짱이아빠 2021. 11. 21. 12:58
반응형

얼마 전 회사 PC에 10년 전 Zip으로 압축해놓은 파일을 열일이 생겼는데 압축 비밀번호가 생각나지 않아 결국 파일을 열지 못했다.

그래서 파이썬을 이용해서 Zip 파일 압축 비밀번호를 알아내는 프로그램을 만들어봐야겠다는 생각을 했다.

 

먼저 인터넷에서 찾아보니 Zip 파일 압축 비밀번호를 알아내는 방법으로 가장 많이 나와있는 것이 Brute Force란 방법이었다.

말 그대로 비밀번호가 일치할 때까지 계속 대입해보는 방식이며 대부분은 비밀번호로 사용될 단어들이 모여있는 파일을 참조하여 하나씩 대입해 보는 방식이었다.

그러나 이 방식은 파일에 실제 비밀번호가 없다면 열수 없는 방식이다.

그래서 여기서는 간단하게나마 알파벳과 숫자의 조합을 랜덤 하게 만들면서 대입해보는 방식으로 만들어 보았다.

 

프로그램은 다음의 모듈을 사용한다. 

import random
import zipfile
import time

 

Zip파일을 불러와서 열 것이므로 zipfile이 필요하고 압축 비밀번호를 랜덤 하게 생성할 것이므로 random 모듈이 필요하다.

또한 압축 비밀번호를 푸는데 걸리는 시간을 알아보기 위해 time 모듈이 필요하다.

 

그 외의 프로그램은 다음과 같다.

start_time = time.time()
number = int(input("패스워드의 자릿수 :"))

while True:
  set = 'abcdefghijklmnopqrstuvwxyz0123456789'
  zfile = zipfile.ZipFile('test.zip','r')
  paw = ''
  
  for i in range(0,2):
    paw += random.choice(set)

  if zfile:
    try:
      zfile.extractall(path='.',pwd=str(paw).encode('utf-8'))
      end_time = time.time()
      print("the compressed password is:", paw)
      print('It tooks %s seconds to crack the compressed file ' % (end_time-start_time))
      #sys.exit(0)
      break

    except Exception as e:
      print('pass password: ', paw)
      pass

 

프로그램 시작 시간을 저장하고 나중에 압축 비밀번호가 풀리면 그 때의 시간과 차를 통해 얼마 큼의 시간이 걸렸는지 계산한다.

알파벳 a~z까지와 숫자 0~9까지의 set를 만들고 암호 자릿수에 따라 랜덤 하게 암호를 만들게 된다.

압축 비밀번호의 자릿수는 원하는 자릿수를 입력하도록 하였다.

 

그 다음은 랜덤 하게 만들어진 조합으로 ‘test’.zip 파일의 비밀번호에 대입하여본다.

맞지 않으면 ‘pass password’에 조합이 표현되고 압축 비밀번호가 맞으면 비밀번호가 표시되고 비밀번호를 맞추는 데까지 걸린 시간을 계산한다.

 

아래는 압축 비밀번호 자릿수를 2로 했을 때의 프로그램의 실행 결과이다.

두 자리수 zip 파일 압축 비밀번호 프로그램 실행 결과
(두 자리수 zip 파일 압축 비밀번호 프로그램 실행 결과)

 

두 자리수의 암호인 ‘h7’을 푸는데 6.6초가 걸렸다.

랜덤으로 조합을 만들어 대입하다 보니 시간은 계속 바뀐다. 

그래서 운이 좋으면 1초도 안되는 시간에 풀리기도 한다.

세 자리수 zip 파일 압축 비밀번호 프로그램 실행 결과
(세 자리수 zip 파일 압축 비밀번호 프로그램 실행 결과)

 

위는 세 자리수로 시험해 본 것이며 약 64초가 걸렸다.

 

프로그램을 google colab에서 실행해서 나온 결과인데 PC의 속도가 빠르다면 시간은 더 단축될 수 도 있을 것이다.

그러나 앞에서 얘기한 바와 같이 랜덤으로 조합으로 만들다 보니 컴퓨터 사양에 상관없이 시간이 상당히 오래 걸리기도 한다.

 

반응형

 

회사에서 풀고자 했던 zip 파일의 압축 비밀번호는 아마도 8자리에 기호도 포함되어 있을 것이다.

set에 기호도 넣고 조합 자리수도 늘리고 프로그램을 실행시키면 아마도 며칠이 걸릴지 몇 달이 걸릴지 모르겠다.

 

좀 더 효율적인 프로그램을 만들고 싶은데 그러기 위해서는 암호를 푸는 방식에 대한 제대로 된 공부가 필요할 것 같다.

그러나 현재는 그렇게까지할 시간도 의지도 없다.

 

반응형

댓글