2015-08-14 52 views
2

我實際上堅持一個想法。所以我想創建如下:通過算法排列算法排列數組構建php

$methods = array('md5()', 'base64_encode()', 'hex2bin()'); 

2)循環併產生像輸出:

1)創建的哈希算法,如一個陣列

方法: md5> md5> md5> base64_encode> md5 =輸出哈希值md5(md5(md5(base64_encode(hex2bin(md5($value))))));

使用的數組位置的數量應該是隨機的,順序也是。

例如:

輸出1:md5(md5($value));

輸出2:md5(base64_encode(md5($value)));

等等......

我的問題是這樣的:我一直在試圖把在每個數組位置末尾的項目數量可以在代碼中看到。但不知何故,這是結果:http://pr0b.com/sqlx/documents/list/hashr.php

它把悲傷的每個項目的括號。代碼如下:

<?php 

    $pass = 'test'; 
    $array_elems_to_combine = array('md5(', 'base64_encode(', 'hex2bin('); 
    $size = rand(0,10); 
    $current_set = array(''); 

    for ($i = 0; $i < $size; $i++) { 
     $tmp_set = array(); 
     foreach ($current_set as $curr_elem) { 
      foreach ($array_elems_to_combine as $new_elem) { 
       $tmp_set[] = $curr_elem . $new_elem . $pass . str_repeat(')', $size); 
      } 
     } 
     $current_set = $tmp_set; 
    } 

    foreach ($current_set as $key) { 
     echo($key) . '</br>'; 
    } 

?> 
+0

更新了問題的一個陣列。 –

+0

只有'md5'是散列函數。另外兩個只是編碼數據。另外,你爲什麼要這樣做?我希望它不是哈希密碼... –

回答

1

如何

<?php 

$value = 'foobar'; 
$methods = array('md5', 'base64_encode', 'sha1'); 

for ($k = 0; $k < 5; $k++) { 
    $nb_recursions = rand(0, 5); 
    $result = recurse_on_methods($methods, $nb_recursions, $value); 
    echo ' = ' . $result . "\n"; 
} 

function recurse_on_methods($methods, $recursions, $value) 
{ 
    $method_no = rand(0, count($methods) - 1); 
    $method = $methods[$method_no]; 

    if ($recursions > 0) { 
     echo $method . ' > '; 
     return $method(recurse_on_methods($methods, $recursions - 1, $value)); 
    } else { 
     echo $method . '(' . $value . ')'; 
     return $method($value); 
    } 
} 

樣本輸出

sha1 > base64_encode > sha1(foobar) = b1322e636ae45c163be50b28f8cb6e51debf341e 
base64_encode > sha1 > md5 > sha1 > md5 > md5(foobar) = ZDBkMzY4YWI4NjRjY2FlNGRmNTAzMGM0NTg5ZmFjZjQ5MmI0MTc2YQ== 
md5(foobar) = 3858f62230ac3c915f300c664312c63f 
md5 > md5 > md5 > base64_encode > sha1(foobar) = 694a8dd41c13868abb9c6300ec87413a 
sha1 > sha1(foobar) = 72833f1c7d3b80aadc836d5d035745ffa3a65894 

這裏假定$methods的功能是同態,可以這麼說,這意味着它們可以組成以任意順序。但是,在您的示例中,hex2bin(hex2bin($value))可能會失敗,因爲hex2bin的輸出不一定是十六進制值。


關於您的評論編輯:如果你正在尋找一個組成f_1(f_2(...(f_N($value))...))返回$hash,那麼你就可以做到以下幾點。首先定義,其生成固定長度N的所有這樣的組合物的函數:

function recurse_on_methods($methods, $N, $value) 
{ 
    if ($N <= 0) { 
     yield [$value, 'id']; 
    } else { 
     foreach ($methods as $method) { 
      $recurse = recurse_on_methods($methods, $N - 1, $value); 

      foreach ($recurse as $r) { 
       yield [$method($r[0]), $method . ' > ' . $r[1]]; 
      } 
     } 
    } 
} 

然後迭代值的N(該組合物的長度)在期望的範圍,並在結果尋找特定散列:

$hash = sha1(md5(sha1(sha1($value)))); 
echo 'Looking for a composition that yields ' . $hash . "\n"; 

for ($N = 1; $N <= 5; $N++) { 
    $results = recurse_on_methods(['md5', 'sha1'], $N, $value); 
    foreach ($results as $r) { 
     if ($r[0] == $hash) { 
      echo $r[1] . '(' . $value . '): ' . $r[0] . "\n"; 
     } 
    } 
} 

輸出:

Looking for a composition that yields 93fe1beeef1c02a4162d47f387728a8c9e8633fd 
sha1 > md5 > sha1 > sha1 > id(foobar): 93fe1beeef1c02a4162d47f387728a8c9e8633fd 
+0

我可以運行這個代碼也直到例如$ value = hash是== 2e0ef2227b116a25bbbcadf2017e86d9,然後回聲散列方法? –

+0

您可以更改'recurse_on_methods'以返回兩個值的數組。第一個值是當前的返回值,第二個值是當前使用'echo'輸出的值。然後你可以用一個簡單的'while'循環將調用包裝到'recurse_on_methods'中,該循環測試第一個返回值。 – Lumen

+0

感謝生病嘗試:) –

0

怎麼樣:

純:

php > echo base64_encode(md5("a value")); 
YTIxM2RmNDA5YzcwNGY2ZWZkOTY4MTEyMDZmODk0ZTI= 

花式:

php > echo array_reduce(['md5','base64_encode'] // add as much as you like 
         ,function($val,$fn){ return $fn($val); } 
         ,"a value"); 
YTIxM2RmNDA5YzcwNGY2ZWZkOTY4MTEyMDZmODk0ZTI= 

編輯:這是僅部分的溶液,剩下的就是創造期望的FN-置換

+0

問題是我不知道真正的哈希方法。我所知道的是純文本值和哈希值,我從中搜索哈希算法。 –

+0

暴力破解是看 - 你有一個使用哈希方法的列表?如果某人使用自定義(而不是內置)哈希或BCRYPT(後續調用不產生相同的哈希),那麼該怎麼辦?bc('A')!= bc('A')'?你打算如何在這裏繼續? – birdspider

+0

我有舊的哈希算法,聽說它應該是相似的。舊的算法如下所示:md5 - md5 - md5 - base64 - hex2bin - md5它可悲地改變了。試圖找出新的價值:2e0ef2227b116a25bbbcadf2017e86d9和純文本:walkman123 –