2011-09-28 3 views
3

본질적으로 내 친구는 자신이 만든 암호화 된 컨테이너에서 자신을 잠급니다. 암호를 입력 할 때 그는 컨테이너에 액세스 할 수 없으므로 오타가 있었음에 틀림 없습니다. 우리는 그것이 무엇을 해야하는지 알고 있으며 실제 암호는이 암호의 변형이거나 암호와 매우 유사합니다. 패스워드가 알려주는 알려진 부분이나 패스워드가 알려진 패턴이 주어진다면 "퍼지"패스워드 크랙에 대한이 개념을 다루는 코드 나 백서를 찾고있다. 언어는 중요하지 않습니다. 난 이미 암호를 강제로 무력화하는 방법을 개발했습니다. 필요한 모든 조합을 시도 할 필요가 없도록 지능적으로 암호를 해독 할 수있는 알고리즘을 개발하는 것이 필요합니다. 나는 다른 누군가가 이미 이것을했다고 생각합니다. 나는이 개념을 어느 정도 이해하고 있지만 누군가이 문제를 이미 해결했을지도 모르는 코드 나 백서를 찾고있다.알려진 알고리즘, 오픈 소스 프로그램 또는 암호를 알기위한 백서가 있습니까?

UPDATE 그래서 나는 사전 구성 (Python을하지만, 어떤 언어로 예를 보내 주시기) 암호에있을 수 있습니다 문자를 사용했습니다. Shift 키 근처에 있기 때문에 표준 QWERTY 키보드의 키 스트로크 근접성, 등가물 및 우발적 인 '/'문자가 각 문자에 대해 고려되었습니다. 여기에서 샘플 암호 구문이 제공되고 각 문자가 시도됩니다. 이것은이 다음 예제입니다 : http://code.activestate.com/recipes/535171-password-cracker/

import os 
from commands import getoutput 

known = { 
    '_': ('_', ' ', '-', '.', '/'), 
    'b': ('b', 'B', '3', '8', '*', 'v', 'V', 'n', 'N', 'g', 'G', 'h', 'H', ' ', '/'), 
    'g': ('g', 'G', '6', '^', 'f', 'F', 'h', 'H', 'b', 'B', 'v', 'V', 't', 'T', '/'), 
    'l': ('l', 'L', '1', '!', ';', ':', 'k', 'K', 'o', 'O', '.', '>', ',', '<', 'p', 'P', '/'), 
    'e': ('e', 'E', '3', '#', '4', '$', 'r', 'R', 'w', 'W', 'd', 'D', '/'), 
    'h': ('h', 'H', '4', '$', 'g', 'G', 'j', 'J', 'y', 'Y', 'b', 'B', 'n', 'N', '/'), 
    'i': ('i', 'I', '1', '|', '!', '\\', 'u', 'U', 'o', 'O', 'k', 'K', '8', '*', '9', '(', '/'), 
    't': ('t', 'T', '7', '&', '+', 'r', 'R', 'y', 'Y', 'g', 'G', '4', '5', '%', '6', '^', '/'), 
    'r': ('r', 'R', 'e', 'E', 't', 'T', 'f', 'F', '4', '$', '5', '%', '/'), 
} 

command = 'open-sesame %s' # hey, use your imagination ;) 
# I obviously supplied only needed letters for this example, I can't tip you 
# off to the real pass phrase ;) This conveys the general idea.... 
passwdBasic = 'Big_Leg_Hitter' 

def main(): 
    arrays = [known[ltr] for ltr in passwdBasic] 
    start = [ltrs[0] for ltrs in arrays] 
    end = [ltrs[-1] for ltrs in arrays] 
    indexes = [0] * len(arrays) 
    maxes = [len(ltrs)-1 for ltrs in arrays] 
    chrs = [ltrs[i] for ltrs, i in zip(arrays, indexes)] 
    while chrs != end: 
     passx = ''.join(chrs) 
     open('tries.txt', 'a+').write(passx + '\n') 
     out = getoutput(command) 
     if 'wrong password' not in out: 
      print 'GOT IT!', passx 
      return 
     # Next letter 
     for i in range(len(indexes)-1, -1, -1): 
      if indexes[i] <= maxes[i]-1: 
       indexes[i] += 1 
       break 
      else: 
       indexes[i] = 0 
     # Make up the chrs 
     chrs = [ltrs[i] for ltrs, i in zip(arrays, indexes)] 


if __name__ == '__main__': 
    main() 

가상의 '오픈 참깨는'암호화 된 볼륨의 특정 유형을 마운트 수정 유틸리티입니다, 그것은 파이썬으로 작성되지 않았습니다하지만 그래서 명령 행 도구로 만들어졌다 이 스크립트는이 스크립트와 상호 작용할 수 있습니다.

과제/연구 방향의 몇 다음 '/'문자를 실수로 Shift 키 대신에 명중 된 경우

  • ,이 사실의 앞에 나타날 수 따라서 암호문에 문자를 추가 한 것 편지들. 이를 솔루션에서 설명해야합니다.
  • @rrenaud에 의해 제안 된 맞춤법 검사기 유틸리티이 통합 것이 좋을 것이다 : 나는 맞춤법 검사 문제를 해결하기 위해 적용되었다 확률 ​​통계의 Baye의 Theorum의 응용 프로그램에 의해 반 했어요 http://norvig.com/spell-correct.html
  • 을; 어떤 연구가 잘못된 키 입력 및 특정 단어 및/또는 문구를 입력 할 때 다른 사람보다 특정 키를 치는 확률에 대해 사용 가능한지 궁금합니다. 이 논리는 일반적인 맞춤법 오류 목록으로 알려진 맞춤법 검사 유틸리티와 거의 같은 방식으로 암호 해독에 적용될 수 있습니다. 신경망 유틸리티를 "훈련"시키는 잘못된 키 스트로크 데이터가 없습니다.

나는 모든 위대한 도움을 주셔서 감사 드리며, 나는 이제까지 모든 사람들의 이익을 위해 어디에 있는지 알고 싶었습니다.

+4

내 "친구"도 이에 대한 답변에 관심이 있습니다.) – nachito

+0

초당 시도 횟수는 얼마나 빠른가요? – corsiKa

+0

이것 역시 도움이 되겠지만, 이제 rrenaud의 코드를이 코드와 결합하는 방법에 대해 궁금해합니다. http://code.activestate.com/recipes/535171-password-cracker/ – Dan

답변

3

알려진 오류가있는 알려진 비밀번호에서 편집을 시도 했습니까? 몇 가지 편집 작업 만 수행하는 경우 (오타 일 경우처럼) 실제로 많은 가능성이 없습니다.

edits1() 함수의 맞춤법 교정을 위해 norvig가 beautiful code에 의해 수정 된 한 수준의 편집을 열거합니다. 당신은 방법의 심화 깊이 첫 번째 종류의 것을 적용 할 수있는, 그래서 당신은 당신이 당신의 문자 집합을 필요

+0

이것은 매우 흥미로웠다. 이제 내가 제공 한 링크로 http://code.activestate.com/recipes/535171-password-cracker/를 어떻게 결합 할 수 있는지 궁금하다. – Dan

+0

잘못된 암호가 있다고 상상할 수있다. 어떤 큰 상호 연결된 그래프의 노드, 비슷한 패스워드 사이에 모서리가있는 곳. Norvig의 맞춤법 교정기 (나는 코드를 반으로 작성하는 것이 좋았 더라면 좋겠다)는 각 편집을 비용 1로 취급한다. 모두 동일하다. 귀하가 게시 한 암호 크래커는 기본적으로 특정 대체물을 저렴한 비용으로 취급합니다. –

+0

이 코드 예제로 업데이트했습니다. – Dan

2
  • 먼저 등 편집의 편집의 단일 처음 편집 한 다음 편집의 편집 및 편집을 시도합니다. 특수 문자가 가능성이 있었습니까? 대문자와 소문자? 번호?

  • 다음은 원래 추측이 필요합니다. 어쩌면 2 번 추측 할 수 있습니다. 두 번째 것에서는 대문자와 소문자가 반전되어 대문자 잠금 키가 작동하지 않을 가능성이 있습니다. (퍼지 대 퍼지)

  • 편집, 삭제 및 삽입의 모든 가능성을 반복해야합니다.

    • 당신은 이제 당신은 당신이 먹고 싶어 얼마나 멀리 결정 초기 추측
  • 3 개 세트 있습니다. 어쩌면이 편집, 2 개 삭제, 또는 2 개 삽입 ... 또는 1 편집 1 개 삽입 또는 1은 설명하기 위해 삭제하고 1 개 삽입 등

일부 자바 스크립트 코드 :

var charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
var guesses = {"passWORD":true, "PASSword":true}; 

function getProps(obj) { 
var lst = []; 
for(var g in obj) 
    lst.push(g); 
return lst; 
} 
function transformEdit(guesses) { 
var lst = getProps(guesses); 
for(var x=0; x<lst.length; x++) { 
    var guess = lst[x]; 
    for(var y=0; y<guess.length; y++) { 
    for(var z=0; z<charset.length; z++) { 
    guesses[guess.slice(0,y) + charset.charAt(z) + guess.slice(y+1)]=true; 
    } 
    } 
} 
} 
function transformDelete(guesses) { 
var lst = getProps(guesses); 
for(var x=0; x<lst.length; x++) { 
    var guess = lst[x]; 
    for(var y=0; y<guess.length; y++) { 
    guesses[guess.slice(0,y) + guess.slice(y+1)]=true; 
    } 
} 
} 
function transformInsert(guesses) { 
var lst = getProps(guesses); 
for(var x=0; x<lst.length; x++) { 
    var guess = lst[x]; 
    for(var y=0; y<guess.length+1; y++) { 
    for(var z=0; z<charset.length; z++) { 
    guesses[guess.slice(0,y) + charset.charAt(z) + guess.slice(y)]=true; 
    } 
    } 
} 
} 

// not the most efficient way 
// but you'll get every possible edit, delete and insert 
transformDelete(guesses); 
transformInsert(guesses); 
transformEdit(guesses); 

getProps(guesses).length; //1759604 

코드를 많은 중복이 피할 수 있었으므로 가장 효율적인 솔루션을 제시하지는 못하지만 한 샷 문제에 대한 암호 목록을 생성하는 것이기 때문에 ...

JS 객체 속성 목록을 다음과 같이 사용했습니다. 추측의 해시 세트.

getProps (추측)에서 반환 한 배열을 반복하여 추측을 암호 목록에 출력 할 수 있습니다.

+0

이것은 좋은 일이지만 추측을 피하기 위해 노력하고 있습니다. 나는 내 질문을 업데이트 할 것이다. – Dan

+0

코드 예제로이를 업데이트했습니다. – Dan

관련 문제