2010-12-03 5 views
0

일부 팀원이 오늘 암호 저장 및 일반적인 보안 문제를 논의하고있었습니다. 어쨌든, GPU 가속 급제 공격이 전통적인 CPU 전용 구현과 어떻게 비교되는지 간단히 논의했습니다.순열 생성

내 관심이있어 일부 코드로 놀기로 결정했습니다. 이전에는 이런 식으로 작성한 적이 없기 때문에 간단한 (CPU 전용) 무차별 대입 (brute-forcer)을 작성하기로 결정했습니다. 나의 초기 구현은 고정 길이 (4 자리)의 패스워드를 다루었 다. 테스트 목적을 위해 다음과 같이 구현했습니다.

for(char a = '0'; a <= '9'; ++a) 
{ 
    for(char b = '0'; b <= '9'; ++b) 
    { 
    for(char c = '0'; c <= '9'; ++c) 
    { 
     for(char d = '0'; d <= '9'; ++d) 
     { 
     candidate[0] = a; candidate[1] = b; 
     candidate[2] = c; candidate[3] = d; 

     // Test 'candidate'... 
     } 
    } 
    } 
} 

이것은 잘 작동하지만 분명히 융통성이 없습니다. 위의 내용을 일반화하여 모든 암호 길이를 처리하려고 시도했지만 실패했습니다. 웬일인지, 나는이 brute-forcers가 "알파벳"이 주어진 1-n 문자 가능성을 뛰어 넘기 위해 사용하는 논리에 대해 머리를 맞출 수 없다.

이 작업을 수행하는 데 사용할 수있는 일반적인 알고리즘이 있습니까? 모든 예제가 환영합니다.

+6

당신이 찾고있는 개념이라고합니다 [재귀] (http://en.wikipedia.org/wiki/Recursion) : –

+0

중복 - http://stackoverflow.com/q/3183469/21727 – mbeckish

+0

prob 렘은 n 중첩 된 루프가 있어야하지만, n은 런타임에만 알려져 있습니다. =/ – BlackBear

답변

0

이 반복 버전 .... 단지 소문자에 대한 다음 작품이지만 쉽게 수정할 수 있습니다 ....

public static String nextLexographicWord(String txt) 
{ 
    char [] letters = txt.toCharArray(); 
    int l = letters .length - 1; 
    while(l >= 0) 
    { 
     if(letters[l] == 'z') 
      letters[l] = 'a'; 
     else 
     { 
      letters[l]++; 
      break; 
     } 
     l--; 
    } 
    if(l < 0) return 'a' + (new String(letters)); 
    return new String(letters); 
} 
+0

그것은 자바, btw .... – st0le