Реальная история.
PHP
// скрипт требует OpenSSL в php.ini должен быть включен
// установить лимит памяти упаковывает у вас есть длинный пароль
ini_set('Memory_limit', '2048M');
// расшифровать эту OpenSSL AES-256-CBC base64 подсоленной строку IV
$ encrypted_file знак равно «Поставить секретный ключ строки резервного копирования вашего пытаются взломать здесь»;
// это будет судить, если вы не заполните форму или добавить? Р = guess1, так что вы можете попробовать много догадок на одном дыхании
$ догадок = Массив ('Guess1','Guess2');
?>
<тело>
<Форма действие ="" метод ="после">
<вход ID ="п" имя ="п" тип ="текст" />
<тип входного ="кнопка" значение ="Отправить" />
форма>
PHP
////////////////////////////////////////////////// //////////////////////
функция getTypos($ ул) {
$ typosArr = Массив ();
$ strArr знак равно str_split($ ул);
$ arr_prox = Массив ();
// нижние опечатки
$ arr_prox[«А»] = Массив («Д», «Ш», «Г», 'Икс','Q', 'W', 'Z', 'ИКС');
$ arr_prox[«Б»] = Массив ('V', «Е», 'г', 'час', «П»,'V', 'F', 'Г', 'ЧАС', 'N');
$ arr_prox[«С»] = Массив ('Икс', 'S', 'D', «Е», 'V','ИКС', 'S', 'D', 'F', 'V');
$ arr_prox['D'] = Массив ('Икс', 'S', «Ш», «Е», 'р', «Е», 'V', «С»,'ИКС', 'S', 'W', 'E', 'Р', 'F', 'V', 'C');
$ arr_prox[«Е»] = Массив («Ш», 'S', 'D', «Е», 'р', 'W', 'S', 'D', 'F', 'Р');
$ arr_prox[«Е»] = Массив («С», 'D', «Е», 'р', «Т», 'г', «Б», 'V', 'C', 'D', 'E', 'Р', «Т», 'Г', 'B', 'V');
$ arr_prox['г'] = Массив ('р', «Е», 'V', «Т», «Б», «У», 'час', «П»,'Р', 'F', 'V', «Т», 'B', 'Y', 'ЧАС', 'N');
$ arr_prox['час'] = Массив («Б», 'г', «Т», «У», «И», 'J', «М», «П»,'B', 'Г', «Т», 'Y', 'U', 'J', 'M', 'N');
$ arr_prox['я'] = Массив («И», 'J', «К», «Л», «О», 'U', 'J', 'K', 'L', 'O');
$ arr_prox['J'] = Массив («П», 'час', «У», «И», 'я', «К», «М»,'N', 'ЧАС', 'Y', 'U', 'Я', 'K', 'M');
$ arr_prox[«К»] = Массив («И», 'J', «М», «Л», «О», 'U', 'J', 'M', 'L', 'O');
$ arr_prox[«Л»] = Массив ('п', «О», 'я', «К», «М», 'П', 'O', 'Я', 'K', 'M');
$ arr_prox[«М»] = Массив («П», 'час', 'J', «К», «Л», 'N', 'ЧАС', 'J', 'K', 'L');
$ arr_prox[«П»] = Массив («Б», 'г', 'час', 'J', «М», 'B', 'Г', 'ЧАС', 'J', 'M');
$ arr_prox[«О»] = Массив ('я', «К», «Л», 'п', 'Я', 'K', 'L', 'П');
$ arr_prox['п'] = Массив («О», «Л», 'O', 'L');
$ arr_prox[«Д»] = Массив («Ш», «А», '1', 'W', 'A', '1');
$ arr_prox['р'] = Массив («Е», 'D', «Е», 'г', «Т», 'E', 'D', 'F', 'Г', «Т»);
$ arr_prox['S'] = Массив («Д», «Ш», «Е», «Г», 'Икс', «С», 'Q', 'W', 'E', 'Z', 'ИКС', 'C');
$ arr_prox[«Т»] = Массив ('р', «Е», 'г', 'час', «У», 'Р', 'F', 'Г', 'ЧАС', 'Y');
$ arr_prox[«И»] = Массив («У», 'час', 'J', «К», 'я', 'Y', 'ЧАС', 'J', 'K', 'Я');
$ arr_prox['V'] = Массив («С», «Е», 'г', «Б», 'C', 'F', 'Г', 'B');
$ arr_prox[«Ш»] = Массив («Д», «А», 'S', 'D', «Е», 'Q', 'A', 'S', 'D', 'E', '1');
$ arr_prox['Икс'] = Массив («Г», «А», 'S', 'D', «С», 'Z', 'A', 'S', 'D', 'C');
$ arr_prox[«У»] = Массив («Т», 'г', 'час', 'J', «И», «Т», 'Г', 'ЧАС', 'J', 'U');
$ arr_prox[«Г»] = Массив ('Икс', 'S', «А», 'ИКС', 'S', 'A');
// верхняя опечаток
$ arr_prox['A'] = Массив ('Q', 'W', 'Z', 'ИКС',«Д», «Ш», «Г», 'Икс');
$ arr_prox['B'] = Массив ('V', 'F', 'Г', 'ЧАС', 'N','V', «Е», 'г', 'час', «П»);
$ arr_prox['C'] = Массив ('ИКС', 'S', 'D', 'F', 'V','Икс', 'S', 'D', «Е», 'V');
$ arr_prox['D'] = Массив ('ИКС', 'S', 'W', 'E', 'Р', 'F', 'V', 'C','Икс', 'S', «Ш», «Е», 'р', «Е», 'V', «С»);
$ arr_prox['E'] = Массив ('W', 'S', 'D', 'F', 'Р', «Ш», 'S', 'D', «Е», 'р');
$ arr_prox['F'] = Массив ('C', 'D', 'E', 'Р', «Т», 'Г', 'B', 'V', «С», 'D', «Е», 'р', «Т», 'г', «Б», 'V');
$ arr_prox['Г'] = Массив ('Р', 'F', 'V', «Т», 'B', 'Y', 'ЧАС', 'N','р', «Е», 'V', «Т», «Б», «У», 'час', «П»);
$ arr_prox['ЧАС'] = Массив ('B', 'Г', «Т», 'Y', 'U', 'J', 'M', 'N',«Б», 'г', «Т», «У», «И», 'J', «М», «П»);
$ arr_prox['Я'] = Массив ('U', 'J', 'K', 'L', 'O', «И», 'J', «К», «Л», «О»);
$ arr_prox['J'] = Массив ('N', 'ЧАС', 'Y', 'U', 'Я', 'K', 'M',«П», 'час', «У», «И», 'я', «К», «М»);
$ arr_prox['K'] = Массив ('U', 'J', 'M', 'L', 'O', «И», 'J', «М», «Л», «О»);
$ arr_prox['L'] = Массив ('П', 'O', 'Я', 'K', 'M', 'п', «О», 'я', «К», «М»);
$ arr_prox['M'] = Массив ('N', 'ЧАС', 'J', 'K', 'L', «П», 'час', 'J', «К», «Л»);
$ arr_prox['N'] = Массив ('B', 'Г', 'ЧАС', 'J', 'M', «Б», 'г', 'час', 'J', «М»);
$ arr_prox['O'] = Массив ('Я', 'K', 'L', 'П', 'я', «К», «Л», 'п');
$ arr_prox['П'] = Массив ('O', 'L', «О», «Л»);
$ arr_prox['Q'] = Массив ('W', 'A', '1', «Ш», «А», '1');
$ arr_prox['Р'] = Массив ('E', 'D', 'F', 'Г', «Т», «Е», 'D', «Е», 'г', «Т»);
$ arr_prox['S'] = Массив ('Q', 'W', 'E', 'Z', 'ИКС', 'C', «Д», «Ш», «Е», «Г», 'Икс', «С»);
$ arr_prox[«Т»] = Массив ('Р', 'F', 'Г', 'ЧАС', 'Y', 'р', «Е», 'г', 'час', «У»);
$ arr_prox['U'] = Массив ('Y', 'ЧАС', 'J', 'K', 'Я', «У», 'час', 'J', «К», 'я');
$ arr_prox['V'] = Массив ('C', 'F', 'Г', 'B', «С», «Е», 'г', «Б»);
$ arr_prox['W'] = Массив ('Q', 'A', 'S', 'D', 'E', «Д», «А», 'S', 'D', «Е» ,'1');
$ arr_prox['ИКС'] = Массив ('Z', 'A', 'S', 'D', 'C', «Г», «А», 'S', 'D', «С»);
$ arr_prox['Y'] = Массив («Т», 'Г', 'ЧАС', 'J', 'U', «Т», 'г', 'час', 'J', «И»);
$ arr_prox['Z'] = Массив ('ИКС', 'S', 'A', 'Икс', 'S', «А»);
// числа опечаток
$ arr_prox['1'] = Массив («Д», «Ш» ,'2');
$ arr_prox['2'] = Массив («Д», «Ш», «Е», '1', '3');
$ arr_prox['3'] = Массив («Ш», «Е», 'р', '2', '4');
$ arr_prox['4'] = Массив («Е», 'р', «Т», '3', '5');
$ arr_prox['5'] = Массив ('р', «Т», «У», '4', '6');
$ arr_prox['6'] = Массив («Т», «У», «И», '5', '7');
$ arr_prox['7'] = Массив («У», «И», 'я', '6', '8');
$ arr_prox['8'] = Массив («И», 'я', «О», '7', '9');
$ arr_prox['9'] = Массив ('я', «О», 'п', '8', '0');
$ arr_prox['0'] = Массив («О», 'п', '-', '9');
// символы (добавить другие символы и соседние клавиши, если ваш пароль имеет их)
$ arr_prox[''] = Массив ('?', '', «Л», 'L', ';', '/');
$ arr_prox['_'] = Массив ('0', '-', знак равно, '[', 'п', 'П');
для каждого($ strArr в виде $ ключзнак равно>$ значение) {
$ темп знак равно $ strArr;
для каждого ($ arr_prox[$ значение] в виде $ проксимити) {
$ темп[$ ключзнак равно $ проксимити;
$ typosArrзнак равно присоединиться(«», $ темп);
}
}
вернуть array_unique($ typosArr);
}
функция свалка($ ключевая фраза) {
$ символов знак равно "! \" \ # $%&«() * +, -. / 0123456789 :;<знак равно>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ [\\] ^ _ `АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ ~»;
$ списокзнак равно «»;
$ списокзнак равно $ ключевая фраза;
# Переставлять соседние символы
для($ я знак равно 0; $ я < (StrLen($ ключевая фраза) - 1); $ я++) {
$ testphrase знак равно $ ключевая фраза;
$ testphrase[$ язнак равно $ ключевая фраза[$ я+1];
$ testphrase[$ я+1знак равно $ ключевая фраза[$ я];
$ списокзнак равно $ testphrase;
}
# Удалить один символ
для($ я знак равно 0; $ я < (StrLen($ ключевая фраза) - 1); $ я++) {
$ testphrase знак равно взрываться(array_slice(str_split($ ключевая фраза), 0, $ я)). взрываться(array_slice(str_split($ ключевая фраза),$ я+2,StrLen($ ключевая фраза) -$ я));
$ списокзнак равно $ testphrase;
}
# Substitutute один символ
для($ я знак равно 0; $ я < (StrLen($ ключевая фраза) - 1); $ я++) {
для($ у знак равно 0; $ у < (StrLen($ символов) - 1); $ у++) {
$ testphrase знак равно $ ключевая фраза;
$ testphrase[$ язнак равно $ символов[$ у];
$ списокзнак равно $ testphrase;
}
}
# Вставить один символ
для($ я знак равно 0; $ я < (StrLen($ ключевая фраза) + 1); $ я++) {
для($ у знак равно 0; $ у < (StrLen($ символов) - 1); $ у++) {
$ testphrase знак равно $ ключевая фраза;
$ testphrase знак равно substr_replace($ testphrase, $ символов[$ у], $ я, 0);
$ списокзнак равно $ testphrase;
}
}
вернуть array_unique($ список);
}
set_time_limit(0);
функция getmicrotime() {
список($ мксек, $ секзнак равно взрываться(«»,микропоры());
Возвращение ((поплавок)$ мксек + (С плавающей точкой)$ сек);
}
$ original_time_start знак равно getmicrotime();
/ **
* Дешифрования AES 256
*
* @param строка $ пароль
* @param данные $ EDATA
* @return dencrypted данные
* /
функция расшифровывать($ пароль, $ EDATA) {
$ данных знак равно base64_decode($ EDATA);
$ соль знак равно зиЬзЬг($ данных, 8, 8);
$ кт знак равно зиЬзЬг($ данных, 16);
/ **
* От https://github.com/mdp/gibberish-aes
*
* Количество раундов зависит от размера AES в использовании
* 3 раунда по 256
* 2 патронов для ключа, 1 для IV
* 2 раунда по 128
* 1 раунд за ключ, 1 раунд за IV
* 3 раундов для 192, так как он не равномерно делится на 128 бит
* /
$ раундов знак равно 3;
$ data00 знак равно $ пароль.$ соль;
$ md5_hash = Массив ();
$ md5_hash[0знак равно md5($ data00, правда);
$ результат знак равно $ md5_hash[0];
для ($ я знак равно 1; $ я < $ раундов; $ я++) {
$ md5_hash[$ язнак равно md5($ md5_hash[$ я - 1].$ data00, правда);
$ результат .знак равно $ md5_hash[$ я];
}
$ ключ знак равно зиЬзЬг($ результат, 0, 32);
$ IV знак равно зиЬзЬг($ результат, 32,16);
вернуть openssl_decrypt($ кт, 'AES-256-CBC', $ ключ, правда, $ IV);
}
функция проверить($ пароль)
{
Глобальный $ encrypted_file, $ TIME_START;
$ decrypted_string знак равно расшифровывать($ пароль, $ encrypted_file);
// Эхо $ пароля. ":";
если(зиЬзЬг( $ decrypted_string, 0, 4 ) === "# KE" ) {
эхо "<бр /><бр />"
. "НАЙДЕНО MATCH, пароль:" . $ пароль . " h1>\ П \ п»;
$ time_end знак равно getmicrotime();
$ время знак равно $ time_end - $ TIME_START;
эхо "Найти в " . $ время . «Секунд \ п»;
Выход;
}
}
функция рекурсию($ ширина, $ позиция, $ base_string)
{
Глобальный $ кодировок, $ str_length;
для ($ я знак равно 0; $ я < $ str_length; ++$ я) {
если ($ позиция < $ ширина - 1) {
рекурсию($ ширина, $ позиция + 1, $ base_string . $ кодировок[$ я]);
}
проверить($ base_string . $ кодировок[$ я]);
}
}
эхо «Целевая хеш:» . $ encrypted_file . «\ П»;