- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
<?php
function word_by_index($index, $dicts) {
$sizes = array_map(function($val){return count($val);}, $dicts); // получаем размеры каждого словаря
$result = '';
foreach($sizes as $key=>$size) {
$result .= $dicts[$key][$index % $size]; // сцепляем слово из частей
$index = floor($index / $size);
}
return $result;
}
function R($hash, $dicts, $total) {
$index = gmp_intval(gmp_mod(gmp_init($hash, 16), $total));
return word_by_index($index, $dicts);
}
function make_chain($start, $length, $dicts, $total) {
$chain['start'] = $start;
for($i = 0; $i < $length; ++$i) {
$hash = md5($start); // <-- сюда вставьте нужную хэш-функцию
// echo ">>> $hash : $start\n"; // диагностическое сообщение
$start = R($hash, $dicts, $total);
}
$chain['end'] = $hash;
echo "Chain from ${chain['start']} to ${chain['end']} is ready.\n"; // диагностическое сообщение
return $chain;
}
function make_chains($count, $length, $dicts) {
$sizes = array_map(function($val){return count($val);}, $dicts); // получаем размеры каждого словаря
$total = array_reduce($sizes, function($carry,$item){return $carry*$item;}, 1); // произведение размеров словарей
$chains = [];
mt_srand();
for($i = 0; $i < $count; ++$i) {
$word = word_by_index(mt_rand(0, $total - 1), $dicts); // начинаем цепочку с псевдослучайного слова
$chain = make_chain($word, $length, $dicts, $total);
$hash = $chain['end']; // используем конец найденной цепочки как индекс для быстрого поиска
if(!isset($chains[$hash])) $chains[$hash] = []; // если такого хэша не было в корзине, инициализируем её
if(!in_array($chain['start'], $chains[$hash])) { // проверяем на дубли
$chains[$hash][] = $chain['start']; // добавляем начало цепочки в корзину
}
}
return $chains;
}
function find_hash_in_basket($needle, $haystack_start, $haystack_end, $dicts, $total) {
echo "Роемся в цепочке от $haystack_start до $haystack_end.\n"; // диагностическое сообщение
$current_word = $haystack_start;
do {
$current_hash = md5($current_word); // <-- сюда вставьте нужную хэш-функцию
if($current_hash === $needle) {
return $current_word; // нашли слово, хэш от которого равен заданному
}
$current_word = R($current_hash, $dicts, $total); // роем в глубину
} while($current_hash !== $haystack_end);
return false; // не нашли
}
function search_hash($hash, $dicts, $chains, $length) {
$sizes = array_map(function($val){return count($val);}, $dicts); // получаем размеры каждого словаря
$total = array_reduce($sizes, function($carry,$item){return $carry*$item;}, 1); // произведение размеров словарей
$current_hash = $hash;
for($i = 0; $i < $length; ++$i) {
if(isset($chains[$current_hash])) { // нашли хэш в одной из корзин
echo "Лезем в корзину $current_hash.\n"; // диагностическое сообщение
foreach($chains[$current_hash] as $start) { // роемся в корзине
$result = find_hash_in_basket($hash, $start, $current_hash, $dicts, $total); // пытаемся найти в каждой из цепочек корзины
if($result) {
return $result; // конец поиска
}
}
}
$next_word = R($current_hash, $dicts, $total); // копаем в глубину
$current_hash = md5($next_word);
}
return false; // не нашли
}
///////////////////// ПРИМЕР //////////////////////////////////
$dicts= array(
array('свино', 'овце', 'тигро', 'косатко', 'зубро', 'волко', 'кото'),
array('собака', 'бык', 'лев', 'дельфин', 'бизон')
);
$chains = make_chains(15, 15, $dicts);
echo "Радужные таблицы готовы.\n";
var_dump($chains);
$hash = '360629d3cf05cee0240a23e1251c58a0';
echo "Пытаемся обратить $hash.\n";
$word = search_hash($hash, $dicts, $chains, 15);
echo "$hash is reversed to $word.\n";
По просьбам трудящихся.
Выхлоп на Ideone:
http://ideone.com/otdCDg
ropuJIJIa 13.10.2019 19:36 # 0
#hybrid_rainbow_table
#proof_of_concept
ropuJIJIa 13.10.2019 19:43 # 0
ropuJIJIa 13.10.2019 19:45 # 0
Выхлоп:
inho-pidar 13.10.2019 20:31 # 0
Давно программируешь?
У тебя сложность поиска какая-то хуевая получается. У тебя нету ни одной операции собственно поиска, в хешмепе или двоичного. В чем профит по сравнению с брутом? Для простоты можешь сделать не гибридные а обычные таблицы.
ropuJIJIa 13.10.2019 21:17 # 0
Есть: $chains[$current_hash]
$chains — это хешмеп.
По сути построение таблиц и есть брут.
Сложность тут и будет больше, чем у поиска по нерадужной таблице.
Профит в размере: от каждой цепочки храним только первое и последнее значение. Промежуточные звенья восстанавливаем итерациями во время поиска.
Просто считай, что радужные таблицы — это архиватор: там тоже тратится время на распаковку, зато требуется меньше места для хранения.
inho-pidar 13.10.2019 21:54 # −1
>построение таблиц и есть брут.
В курсе.
ropuJIJIa 13.10.2019 22:27 # 0
Количество же цепочек подбирается таким образом, чтобы звеньями покрыть максимальную часть области значений пароля или хэша. Проблема в том, что трудно проверить, всё мы покрыли или нет, поэтому пользуются априорными оценками (например, если произведение количества цепочек на длину каждой в три раза превышает количество возможных значений пароля, то покрытие будем считать удовлетворительным). А не всё мы можем покрыть из-за того, что в цепочках встречаются одинаковые фрагменты, поэтому в априорной оценке и стоит коэффициент запаса.
cmepmop 13.10.2019 22:28 # −102
Я видел твою портянку. Ведь не поленился же - сидел, писал.
И кстати, хрук-хрук-хрук.
inho-pidar 13.10.2019 23:06 # 0
Покрыть всё невозможно в принципе, т.к. у тебя взятие с возвратом, а вовсе не почему-то еще.
ropuJIJIa 14.10.2019 00:09 # 0
codershitter 14.10.2019 01:39 # 0
guest8 15.10.2019 01:52 # −999
nemyx_pycu4 15.10.2019 04:41 # −102
И почему я не удивлен?
codershitter 14.10.2019 01:38 # 0
MPA3b 14.10.2019 23:11 # 0
Dpyrou_Pycoqpo6_CEMA 14.10.2019 16:58 # −102
Понемногу уже рядовых ватников отлавливают
Шести участникам петербургского отделения проправительственного движения "Молодая гвардия" закрыли въезд в шенгенскую зону на 10 лет. По их мнению, причиной стало их участие в акции "Бессмертный полк" в Таллинне минувшей весной.
Активистка "Молодой гвардии "Единой России" Анастасия Ковеза узнала о введении запрета на пограничном пункте: "Меня остановили на границе с Финляндией и там стали разбираться. Причину не объяснили. Сказали, что все страны Шенгена попадают под этот запрет, хотя претензии есть только у одной страны".
Ковеза предположила, что запрет появился из-за сотрудничества МГЕР с эстонской организацией "Российские соотечественники в Европе". Организация пригласила мгеровцев поучаствовать в эстонской акции "Бессмертный полк" 9 мая 2019 года. Ковеза утверждает, что сама она на шествие тогда не поехала. Теперь она рассчитывает на поддержку государства: "Мы обратились в МИД и надеемся на их помощь".
Еще двое коллег Анастасии узнали о запрете на въезд в немецком аэропорту.
Сергей Христенко написал в соцсетях, что считает запрет "абсолютно политическим решением" и отметил, что акция "Бессмертный полк" в Таллинне была согласована властями эстонского города.
guest8 14.10.2019 19:40 # −999
nemyx_pycu4 14.10.2019 20:19 # −102
inho-pidar 14.10.2019 19:43 # 0
inho-pidar 14.10.2019 19:44 # 0
guest8 14.10.2019 19:53 # −999
inho-pidar 14.10.2019 21:44 # 0
nemyx_pycu4 14.10.2019 22:17 # −102
cmepmop 14.10.2019 22:22 # −102
Типичный ватник, в общем.
inho-pidar 14.10.2019 19:45 # 0