2015-08-14 2 views
2

Я на самом деле застрял в идее. Так что я хочу создать следующий:алгоритм перестановок массив здание php

1) Создать массив алгоритмов хэширования, как:

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

2) Петля через алгоритм перестановок и генерирует выходной сигнал, как:

Метод: 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 is == 2e0ef2227b116a25bbcadf2017e86d9, а затем выйдет из хэш-метода? –

+0

Вы можете изменить 'recurse_on_methods', чтобы вернуть массив из двух значений. Первое значение - это текущее возвращаемое значение, а второе значение - то, что в настоящее время выводится с помощью 'echo'. Затем вы можете перенести вызов на 'recurse_on_methods' с помощью простого цикла while, который проверяет первое возвращаемое значение. – 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= 

EDIT: это лишь частично решение, что остается создание массива желаемому Fn-перестановки

+0

Проблема в том, что я не знаю метода хэширования актуалов. Все, что я знаю, - это текстовое значение Plain и хешированное значение, из которого я ищу хеш-алгоритм. –

+0

скот форсинга - есть ли у вас список используемых хеш-методов? Что делать, если кто-то использует пользовательский (не встроенный) хеш или, т. Е. BCRYPT, где последующие вызовы не производят один и тот же хеш - 'bc ('A')! = Bc ('A')'? как вы планируете продолжить здесь? – birdspider

+0

У меня есть старый алгоритм хеширования и слышал, как он должен быть похожим. Старый алгоритм выглядит так: md5 - md5 - md5 - base64 - hex2bin - md5 Это печально изменилось. Попытка выяснить новый алгоритм ценности: 2e0ef2227b116a25bbbcadf2017e86d9 и Обычный текст: walkman123 –

Смежные вопросы