2011-02-18 3 views
1

이것은 기본적으로 가상의 프로그램입니다 - 2^128 조합이 있습니다 (또는 2^128-1입니까? 확실하지 않습니까? 아니면 128을 127로 대체해야합니까?)하지만 작동하지 않습니다.MD5가 자체 해시를 검색하는 PHP 스크립트?

<?php 

$end = (int)base_convert("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",36,10); 
$count = 0; 
for($count = 0; $count < $end; $count++) { 
    $startHash = base_convert((string)$count,10,36); 
    //Add zeros to the beginning if the length is less than 32 
    while(strlen($starthash) < 32) { 
     $starthash = "0" + $startHash; 
    } 
    $endHash = md5($startHash); 
    if($startHash == $endHash) { 
     file_put_contents("MD5.txt", file_get_contents("MD5.txt") + $startHash + "\n"); 
    } 
} 

?> 

왜 그런지는 잘 모르겠습니다. 어떤 오류도 발생시키지 않습니다. 내가 기대하는 바는 CPU의 100 %를 사용하지만 0.1 % 이상을 사용하지 않는다는 것이다.

무슨 일이 일어 났는지 알고 있습니까?

답변

1

마이크가 말했듯이, 케이스가 잘못되었습니다. 그러나 그 외에도 md5 해시는 실제로 문자와 숫자만으로 구성되도록 32 바이트로 표현되는 16 문자 값입니다. 이 경우, 항상 숫자 0-9와 문자 A ~ F (또는 f ~ f)로 구성되므로 실제로 확인해야합니다. 이제 32 문자 md5 코드가 기본 36 숫자라는 잘못된 가정을합니다.

md5 함수에는 16 바이트 원시 코드를 가져올 수있는 두 번째 매개 변수가 있습니다.

또 다른 문제는 PHP가 너무 빠르지 않고 대개 시간 초과가 있다는 것입니다. 다른 언어로 프로그램을 작성하고, 스레딩을 추가하고, 값을 정기적으로 저장하는 것이 더 좋을 수 있으므로 종료 후 프로그램을 재개 할 수 있습니다.

[편집] 아마도 이것은 얼마나 오래 기다릴 지에 대한 아이디어를 줄 것입니다. md5 = 16 바이트 = 최대 4 억 ($ FFFFFFFF) 인 정수 4 개. 따라서이 16 바이트의 모든 값을 반복하려면 네 개의 네 루프를 각각 네 개의 네 루프로 중첩해야합니다.

<? 
for($a = 0; $a <= 0xFFFFFFFF; $a++){ 
    for($b = 0; $b <= 0xFFFFFFFF; $b++){ 
     for($c = 0; $d <= 0xFFFFFFFF; $c++){ 
      for($d = 0; $d <= 0xFFFFFFFF; $d++){ 
       $code = 
        str_pad(dechex($a), 8, "0", STR_PAD_LEFT). 
        str_pad(dechex($b), 8, "0", STR_PAD_LEFT). 
        str_pad(dechex($c), 8, "0", STR_PAD_LEFT). 
        str_pad(dechex($d), 8, "0", STR_PAD_LEFT); 
       $md5code = md5($code); 
       if ($code == $md5code) 
       { 
        echo $code . "\n"; // Found one 
       } 
      } 
     } 
    } 
} 
echo 'done'; 
+0

로컬 Wamp 서버에서이 작업을 실행하면 CPU 사용률이 100 % 응용 프로그램이 잘 작동합니다. 60 초 후에 타임 아웃이 생깁니다. 프로덕션 서버가보다 잘 보호되고 주어진 요청으로 인해 CPU 전원이 약간 이상을 요구하는 것을 상상할 수 있습니다. – GolezTrol

1

제가 보는 주된 문제는 당신이 $startHash의 경우와 일치하지 않는다는 것입니다. PHP의 변수는 대소 문자를 구분합니다.

1

루프 변수 $count은 일반적인 PHP 정수입니다. 그것은 128 비트까지 성장하지 않습니다. 이진 문자열이나 더 나은 아직 사용해야합니다 :

$end = gmp_init("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); 
$count = gmp_init("0"); 

for (; gmp_cmp($count, $end) == 0; $count=gmp_add($count, 1)) { 

그리고 그것은 해시 해시의 16 진수 표현 자체를 보려고하는 것 같습니다. 그래서 당신은 아마 16 gmp + base_convert해야합니다.

마지막으로 당신이 그러나 결과를 얻을 것이다 의심 file_put_contents($fn, $data, FILE_APPEND)

을 시도합니다. CPU 사용량이 증가하더라도.

관련 문제