В PHP есть встроенная функция bcmod, она делит два числа и результатом её работы является остаток от деления этих чисел. Я знаю только два числа, «модуль», который делит первое число и знаю остаток от деления, как узнать первое число? Например: $code = 6501936; $n = 34483243243248381; $code = bcmod ($code1, $n); Помогите решить задачу и узнать $code1, как будет выглядеть функция «обратная» $code = bcmod ($code1, $n); Ниже написано значение которое в результате должна показывать эта функция. $code1 = 992040606017799963616723245302100328959546519262591092239688468238374872803025149;
обратной функции не существует. у любого остатка от деления есть великое множество чисел, от которых может быть получен такой остаток. Пример: делитель 2, остаток 1. делимое = любое из нечетных натуральных чисел. то есть бесконечное количество решений. p.s. судя по размеру числа, ты пытаешся взломать систему с открытым ключем ))) ну удачи!
Есть такой алгоритм шифрования RSA, в нём есть функции: function encrypt ($m, $e, $n, $s=3) { $coded = ''; $max = strlen($m); $packets = ceil($max/$s); for($i=0; $i<$packets; $i++){ $packet = substr($m, $i*$s, $s); $code = '0'; for($j=0; $j<$s; $j++){ $code = bcadd($code, bcmul(ord($packet[$j]), bcpow('256',$j))); } $code = bcpowmod($code, $e, $n); $coded .= $code.' '; } return trim($coded); } ############ и function decrypt ($c, $d, $n) { $coded = split(' ', $c); $message = ''; $max = count($coded); for($i=0; $i<$max; $i++){ $code = bcpowmod($coded[$i], $d, $n); while(bccomp($code, '0') != 0){ $ascii = bcmod($code, '256'); $code = bcdiv($code, '256', 0); $message .= chr($ascii); } } return $message; } Так вот, не работает только encrypt т.к. я не знаю значения $e, т.е. последняя цепочка требует знания $e, $code = bcpowmod($code, $e, $n); Все остальные значения я знаю, возможно ли имея несколько зашифрованных и расшифрованных сообщений узнать $e? Или это необратимая операция?
Если я не ошибаюсь encrypt - закодировать. Она не может не работать - тот кто кодирует должен обладать ключём с помощью которого кодирует =) криптография она такая криптография, алгоритм может и должен публиковаться открыто, но даже зная его хрен ты чего сделаешь не зная ключа а я как раз подозреваю что е - это ключ. любая криптография ломается подбором, даже основанная на эллиптических кривых, время подбора несколько тысяч лет. Добавлено спустя 1 минуту 57 секунд: абсолютно прав
математики могут меня поправить, типа "обратная функция пока не найдена". так будет корректнее ))) с запуском каких-нибудь бозонных компьютеров, многие представления могут резко устареть.
Ребята, какие бозонные компьютеры и миллиарды лет? Ладно обратной функции не существует, но подобрать то всё возможно? Интересующее меня сообщение имеет вид "15823621635318829 5824865800319137 и т.д. т.е цифры разбитые на блоки", в конце функция проверяет - return $mesage == md5($message); Т.е. я шифрую своё сообщение в md5, оно коротенькое, имеет вид - "06cccb6cdff4dea5b230a647db9e7c8", но поскольку изначальный шифр похож на цифровые блоки, то разбор первого блока даёт - "06c", а если точнее - 0 06 06c Если три цифры "06c" представлены числом 15823621635318829, то сколько мне нужно времени на подбор нужного мне сообщения, если я зашифрую его в md5 - $n = md5($m1); и буду знать что получу на выходе, но не знаю какое это число? И как это сделать быстрее и проще? $s1 = '15823621635318829'; $coded = split(' ', $s1); $message = ''; $n = '34483243243248381'; $max = count($coded); for($i=0; $i < $max; $i++){ $code1 = bcpow($coded[$i], "5", 0); $code2 = bcdiv($code1, $n); $code3 = bcmul($code2, $n); $code = bcmod($code1, $n); while(bccomp($code, '0') != 0){ $ascii = bcmod($code, '256'); $code = bcdiv($code, '256', 0); $mesage .= chr($ascii); print_r($mesage); echo "<br />"; } } print_r($mesage); echo "<br />"; $n = md5($m1); echo " - ЕСЛИ ТРИ ЧИСЛА ОДИНАКОВЫ, ТО ВСЁ ВЕРНО<br />"; echo " 362b08265d9545r8d88c44d08";
не, если бы квантовых хватило, уже сейчас все на ушах стояли бы Добавлено спустя 6 минут 22 секунды: Возможно теоретически. Даже конкурсы временами устраивают по взлому конкретного сообщения. Твой пример не с конкурса? Только это очень трудоемко. Именно поэтому несимметричное шифрование и подписи так распостранены -- потому что вероятность подбора исчезающе мала.
Да, конкурсы устраивают, с 1987 года есть один конкурс, который до сих пор никто не может решить.) Просто пробовал другие числа, знаки не те получаются, крякозябры, значит есть возможность определения алгоритма и написания какой-нибудь функции. Скажу сразу - у меня есть товарищ, который решил эту задачу очень просто и не хочет мне говорить как, а я всё ломаю над этим голову))
я чтот не понял, это уже вторая задача?: у тебя есть md5 хэш и ты хочешь подобрать исходное сообщение которое даёт такой хэш? или я что-то не вкуриваю. Недавно на паскале писал шифрование алгоритма TEA (Сеть Фейштеля) Процедуры кодирования декодирования: Код (Text): procedure EnCrypt(var data); var X1,X2,X3,X4,X5,sum : longint; begin sum := 0; X1 := TBlock(data)[1]; X2 := TBlock(data)[2]; X3 := TBlock(data)[3]; X4 := TBlock(data)[4]; X5 := TBlock(data)[5]; for a := 1 to 32 do begin sum := sum + delta; X1 := X1 + ( ( (X2 shl 4) + Key[1] ) xor ( X2+sum ) xor ( (X2 shr 5) + Key[2]) ); X2 := X2 + ( ( (X3 shl 4) + Key[1] ) xor ( X3+sum ) xor ( (X3 shr 5) + Key[2]) ); X3 := X3 + ( ( (X4 shl 4) + Key[1] ) xor ( X4+sum ) xor ( (X4 shr 5) + Key[2]) ); X4 := X4 + ( ( (X5 shl 4) + Key[1] ) xor ( X5+sum ) xor ( (X5 shr 5) + Key[2]) ); X5 := X5 + ( ( (X1 shl 4) + Key[3] ) xor ( X1+sum ) xor ( (X1 shr 5) + Key[4]) ); end; TBlock(data)[1] := X1; TBlock(data)[2] := X2; TBlock(data)[3] := X3; TBlock(data)[4] := X4; TBlock(data)[5] := X5; end; procedure DeCrypt(var data); var X1,X2,X3,X4,X5,sum : longint; begin sum := $C6EF3720; X1 := TBlock(data)[1]; X2 := TBlock(data)[2]; X3 := TBlock(data)[3]; X4 := TBlock(data)[4]; X5 := TBlock(data)[5]; for a := 1 to 32 do begin X5 := X5 - ( ( (X1 shl 4) + Key[3] ) xor ( X1+sum ) xor ( (X1 shr 5) + Key[4]) ); X4 := X4 - ( ( (X5 shl 4) + Key[1] ) xor ( X5+sum ) xor ( (X5 shr 5) + Key[2]) ); X3 := X3 - ( ( (X4 shl 4) + Key[1] ) xor ( X4+sum ) xor ( (X4 shr 5) + Key[2]) ); X2 := X2 - ( ( (X3 shl 4) + Key[1] ) xor ( X3+sum ) xor ( (X3 shr 5) + Key[2]) ); X1 := X1 - ( ( (X2 shl 4) + Key[1] ) xor ( X2+sum ) xor ( (X2 shr 5) + Key[2]) ); sum := sum - delta; end; TBlock(data)[1] := X1; TBlock(data)[2] := X2; TBlock(data)[3] := X3; TBlock(data)[4] := X4; TBlock(data)[5] := X5; end; Всё зашифровывает и расшифровывает... Пожалуйста объясни свою задачу понятней, я по несколько раз перечитываю и нифига не вкуриваю, хотя как видишь совсем недавно на практике занимался криптографией.
Всё просто, это не вторая, а одна и та же задача. Да! Абсолютно верно! Код (Text): private function prove($message, $signature) { $coded = explode(" ", $signature); $mesage = ""; $max = count($coded); $n = "34483243243248381"; $i = 0; while ($i < $max) { $code = bcmod(bcpow($coded[$i], "5", 0), $n); $i++; while (bccomp($code, "0") != 0) { $ascii = bcmod($code, "256"); $code = bcdiv($code, "256", 0); $mesage1 .= chr($ascii); continue; } continue; } return $mesage1 == md5($message2); } Функция проверяет является ли 1 сообщение равным 2 сообщению. 2 сообщение это просто адрес сайта и дата, я знаю в каком оно должно быть формате и соответственно могу написать любую дату, захешировать в md5 и теперь мне нужно подобрать её в "численном выражении, т.к. по этой функции уже известное численное сообщение с "устаревшей датой" равно "14001343445167338 5824865800319137 8697685512950663 8535433360079566 15967452656546222 20282029223956019 11460306196490294 12915957959486199 383526302010857 20093916592345963 4982076265770298" что в разборе даёт: Код (Text): 4 4b 4ba 4ba6 4ba61 4ba613 4ba613f 4ba613f3 4ba613f3e 4ba613f3e9 4ba613f3e92 4ba613f3e921 4ba613f3e921b 4ba613f3e921ba 4ba613f3e921bab 4ba613f3e921bab4 4ba613f3e921bab4d 4ba613f3e921bab4dc 4ba613f3e921bab4dc6 4ba613f3e921bab4dc60 4ba613f3e921bab4dc601 4ba613f3e921bab4dc6013 4ba613f3e921bab4dc6013c 4ba613f3e921bab4dc6013cb 4ba613f3e921bab4dc6013cb8 4ba613f3e921bab4dc6013cb8a 4ba613f3e921bab4dc6013cb8a2 4ba613f3e921bab4dc6013cb8a21 4ba613f3e921bab4dc6013cb8a21b 4ba613f3e921bab4dc6013cb8a21b8 4ba613f3e921bab4dc6013cb8a21b87 4ba613f3e921bab4dc6013cb8a21b878 4ba613f3e921bab4dc6013cb8a21b878 - ЕСЛИ ОНИ ОДИНАКОВЫ, ТО ВСЁ ВЕРНО(НИЖЕ СООБЩЕНИЕ md5($message2)) 4ba613f3e921bab4dc6013cb8a21b878 Причём, если я меняю в первом блоке цифр "14001222445167338" на "24001222445167338", то мне выдаются "крякозябры", значит эта функция работает по какой-то логике и подобрать её будет проще, а в самом начале я пытался решить задачу не "подбора", а хотел "повернуть функцию обратно", но поскольку обратных функций не существует, то прийдётся подобрать, но по "логике" например указать php что нужно при подборе цифр использовать нужный алгоритм, как это сделать, сейчас думаю.
Из блоков цифр (14001222445167338 5824865800319137 8697685512950663 8535433360079566) получают с помощью необратимых функций и с потерей данных белее короткие сообщения ( 4 b a 6 ) интересно: одну кракозябру или все остальные кракозябры тоже если первый случай, то для зашифровки текущего блока данных не используются данные предыдущего шифрования и ещё что-то можно сделать и подобрать. если второй случай (кракозябров много) то для шифровки текущего блока используются данные предыдущего шифрования - в этом случае забейте на подбор. Итак допустим у нас первый случай. Тогда у меня такой вопрос: я немного не разобрался, так как не пойму откуда кракозябра? : ведь алгоритм шифрования как я понял представлен выше и в нем строки: $mesage1 .= chr($ascii); и кракозябр там быть не может, разве что управляющие символы в начале, но они не кракозябры а просто невидимы, хотя хз чем ты смотришь. Или значит это не алгоритм шифрования а какой то проверки, тогда откуда он у вас... сами или уже достоверный действительно рабочий код... В случае одной кракозябры, что очень странно, всё совсем просто, есть 256 символов, есть 256 вариантов цыфровых сообщений (8535433360079566) которые однозначно преобразуются в этот набор. Но не факт что этот набор именно тот что был изначально, так как из А = 8, но и Ц = 8, а что вам нужно А или Ц хер поймешь... Допустим вы получите исходное сообщение: цифровой набор: "14001222445167338 5824865800319137 8697685512950663 8535433360079566 15967452656546222 20282029223956019 11460306196490294 12915957959486199 383526302010857 20093916592345963 4982076265770298" что это вам даст? Ничего! Та функция которая у вас на руках, я уверен это только одна из проверяющих ступеней, второй такой функцией "Дешифровки" ваш набор должен быть послан на три буквы (так как поддельный). Иначе это нифига не шифрование RSA, а хрень какая-то )
На данном этапе я имею целый набор расшифрованных (более 1000 сообщений), задача сводится только к тому, чтобы написать правильный алгоритм определения матрицы. Добавлено спустя 29 минут 59 секунд: Например, мне изначально известно как генерируются несколько комбинаций: Код (Text): 1623d56364563666bdec2e6e1b36481b 6a01a8a354682e088adff815e0a5e 41fffc5953466ff6fff573191f61864 и т.д. Мне нужно сгенерировать комбинацию: "988192b1a609aeacc6fff17a3291d3d" Методом поиска я уже нашёл несколько идентичных "тройных" комбинаций, но если бы была матрица, то мог бы генерировать их сколько угодно, а не искать.. $mesage == md5($message); - это единственное что имеется в защите, исходный код у меня есть и полностью открыт. Да, это RSA-алгоритм, придуман в 1970 годах и пользуется популярностью до сих пор. Считается одним из самых криптоустойчивых алгоритмов.
вернее не "как", а из чего? можешь скинуть сюды из чего комбинируется каждая вышеприведенная строчка и скрипт кодирования если есть поподробнее, хотя вроде всё есть. эээ это не генерация каких-нибудь там ключей к проге? например photoshop? Мож это сигнализация какая нить от тачки? Или от метро карточки? Не? =D кались Добавлено спустя 2 минуты 49 секунд: аа, чо-то там домен и время, мммм на пароли не похоже... ммм
Вот код, декодирования и кодирования, кодирование почему-то не работает, последнее звено не получается. Код (Text): $m = ""; $e = "5"; $s = "3"; $n = '34483243243248381'; $coded = ''; $max = strlen($m); $packets = ceil($max/$s); for($i=0; $i<$packets; $i++){ $packet = substr($m, $i*$s, $s); $code = '0'; for($j=0; $j<$s; $j++){ $code = bcadd($code, bcmul(ord($packet[$j]), bcpow('256',$j))); } #$code = bcpowmod($code, $e, $n); //НЕ РАБОТАЕТ $coded .= $code.' '; } $coded2 = trim($coded); print_r($coded2); Здесь всё работает: Код (Text): $s1 = ''; $coded = split(' ', $s1); $message = ''; $n = '34483243243248381'; $max = count($coded); for($i=0; $i < $max; $i++){ $code1 = bcpow($coded[$i], "5", 0); $code2 = bcdiv($code1, $n); $code3 = bcmul($code2, $n); $code = bcmod($code1, $n); while(bccomp($code, '0') != 0){ $ascii = bcmod($code, '256'); $code = bcdiv($code, '256', 0); $mesage .= chr($ascii); print_r($mesage); echo "<br />"; } } print_r($mesage); echo "<br />";