2010-01-27 2 views
4

내가 3 자 사이의 암호로 보호 된 RAR 아카이브를 무력하려고 :파이썬 :는 RAR 브 루트 포서

import os 
Alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
for a in range(0,26): 
for b in range(0,26): 
    for c in range(0,26): 
    Brute = Alphabets[a] + Alphabets[b] + Alphabets[c] 
    os.popen4("Rar.exe x -p" + Brute + " Protected.rar") 
# raw_input() 
raw_input("Done !") 

코드는 제외하고, 잘 작동 : 그것은 매우 느립니다!

나는 그것이 "popen4"에 의해 다중 열리는 것이 느린 것으로 생각한다. 나는 txt 파일에 생성 된 단어를 저장하려고했기 때문에 프로그램은 5 초 이내에 완료되었습니다.

아이디어를 높이려면 어떤 아이디어가 필요하십니까? 그것은 반드시 성능을 개선하지 않을 수 있습니다

>>> import string 
>>> import itertools 
>>> from subprocess import Popen, PIPE 
>>> for i in itertools.product(string.ascii_uppercase, repeat=3): 
    pr = Popen(['rar.exe', 'x', '-p', ''.join(i), 'protected.rar'], stdin=PIPE, stdout=PIPE) 
    pr.communicate() 

, 그러나 당신의 코드 청소기을 수행합니다

+0

내가이 문제를 도와야할지 잘 모르겠지만 한 가지 즉각적인 문제가 떠오른다. 테이블을 미리 생성하십시오. – Skurmedel

+0

python/알고리즘에 대해서는 의문의 여지가 있지만 여기에는 분명히 의문의 여지가 있습니다. –

+10

암호는 개, 고양이 또는 신입니다. –

답변

5

당신은 몇 가지 다음 stdlib 모듈을 사용하는 것이 좋습니다.

+1

itertools.permutations는 모든 가능한 3 자 암호를 제공하지 않습니다. itertools.product (* [string.uppercase] * 3)를 원한다. 또한 os.join이라는 함수가 없습니다. 가장 가까운 것은 완전히 다른 것을하는 os.path.join입니다. 대신 ''.join (i)을 사용하십시오. 마지막으로, 질문자의 문제는 성능이므로 Python 스크립트 자체에 소요되는 시간은 무시할 수 있으므로 관련 내용이 없습니다. – David

+0

@David : 실제로 '제품'입니다. 감사합니다. 나는 무시할 수 있건 없건 상관없이 내 코드가 원본 코드에 가능한 모든 성능 향상을 제공한다고 주장한다. – SilentGhost

7

rarcrack을 사용할 수 있습니다. 그것은 C로 작성되었으며 Linux (많은 변경 사항이있는 Windows)에서 문제없이 컴파일합니다.

일반적으로 테스트 된 모든 단일 암호에 대해 프로세스를 여는 것은 비용이 많이 듭니다. 직접 아카이브를 열어보고 모든 암호를 테스트해야합니다. 어쨌든 rar.exe의 반환 값을 테스트하여 추출이 성공했는지 확인해야합니다.

최상의 성능을 얻으려면 C로 프로그램을 작성해야합니다. RAR 파일을 여는 데 도움이되는 "libunrar"라는 Linux 패키지가 있습니다.

3

암호 생성은 간단합니다. 따라서 26^3 = 17576 암호를 만드는 데 5 초 밖에 걸리지 않습니다. 가장 많은 시간을 필요로하는 것은 아카이브를 열고 해독하려고 시도하는 것이며 그 권한은 제어 할 수 없습니다.

속도 향상에 대해서는 할 수있는 일이 많지 않습니다. 처음 몇 번 시도한 후에 rar 바이너리와 입력 파일이 메모리에 캐시됩니다. 필요한 경우 밤새 또는 주말에 실행하십시오.

+1

100k 텍스트 파일을 생성하는 데 거의 5 초가 걸리는 것은 나에게 느린 것 같습니다. –

0

먼저 암호를 생성 한 다음 rar.exe 프로세스 호출 (병목 현상이있는 것 같습니다)을 병렬화하는 방법은 무엇입니까?

+0

은 좋은 아이디어처럼 보입니다. 작은 예제를 보여줄 수 있습니까? –

0

아카이브 해독을 시도하는 데 걸리는 시간을 줄이지 못할 수도 있지만 비밀번호가 완전히 임의가 아니라고 가정하면 올바른 비밀번호를 얻을 수 있습니다 보다 신속하게 문자를 주문하면 사용 가능성이 줄어 듭니다.

예를 들어, Linux Journal에서 쉘 스크립트 열은 e, t, a, o, n, i, s, r, h 및 d가 이들 중 가장 일반적인 글자임을 확인하기 위해 몇 가지 큰 텍스트를 분석했습니다. 텍스트 (아마도 이것은 영어에 가깝습니다). 따라서 두 번째 줄을 Alphabets = "ETAONIBSRHDCFGJKLMPQUVWXYZ"으로 변경하면 알고리즘이 반복적으로 암호에 도달하게 될 수 있습니다.

편집 : 제 생각 만약 암호입니다, 누군가가, "고양이", 표시된대로 새 버전이 11 개 패스를 필요로하는 반면, 외부 루프를 통해 3 개 패스를 필요로이 경우에는 그렇게 할 것이다 원래 주문이 더 빨리 해결하지 못할 것입니다. 아마 가장 가능성있는 첫 번째 문자를 예측하여 외부 루프의 목록을 최적화해야합니다.