За последние 24 часа нас посетили 18666 программистов и 1604 робота. Сейчас ищут 983 программиста ...

Помогите в решении небольшой формулы с bcmod

Тема в разделе "Прочие вопросы по PHP", создана пользователем medbrat, 30 окт 2013.

  1. medbrat

    medbrat Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    В PHP есть встроенная функция bcmod, она делит два числа и результатом её работы является остаток от деления этих чисел. Я знаю только два числа, «модуль», который делит первое число и знаю остаток от деления, как узнать первое число?

    Например:

    $code = 6501936;
    $n = 34483243243248381;

    $code = bcmod ($code1, $n);

    Помогите решить задачу и узнать $code1, как будет выглядеть функция «обратная» $code = bcmod ($code1, $n);
    Ниже написано значение которое в результате должна показывать эта функция.

    $code1 = 992040606017799963616723245302100328959546519262591092239688468238374872803025149;
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    обратной функции не существует. у любого остатка от деления есть великое множество чисел, от которых может быть получен такой остаток.

    Пример:
    делитель 2, остаток 1. делимое = любое из нечетных натуральных чисел.
    то есть бесконечное количество решений.

    p.s. судя по размеру числа, ты пытаешся взломать систему с открытым ключем ))) ну удачи!
     
  3. medbrat

    medbrat Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    Есть такой алгоритм шифрования 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? Или это необратимая операция?
     
  4. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Если я не ошибаюсь encrypt - закодировать. Она не может не работать - тот кто кодирует должен обладать ключём с помощью которого кодирует =)

    криптография она такая криптография, алгоритм может и должен публиковаться открыто, но даже зная его хрен ты чего сделаешь не зная ключа

    а я как раз подозреваю что е - это ключ.

    любая криптография ломается подбором, даже основанная на эллиптических кривых, время подбора несколько тысяч лет.

    Добавлено спустя 1 минуту 57 секунд:
    абсолютно прав
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    математики могут меня поправить, типа "обратная функция пока не найдена". так будет корректнее )))
    с запуском каких-нибудь бозонных компьютеров, многие представления могут резко устареть.
     
  6. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    квантовых?
     
  7. medbrat

    medbrat Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    Ребята, какие бозонные компьютеры и миллиарды лет? Ладно обратной функции не существует, но подобрать то всё возможно? Интересующее меня сообщение имеет вид "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";
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    не, если бы квантовых хватило, уже сейчас все на ушах стояли бы :)

    Добавлено спустя 6 минут 22 секунды:
    Возможно теоретически. Даже конкурсы временами устраивают по взлому конкретного сообщения. Твой пример не с конкурса?
    Только это очень трудоемко. Именно поэтому несимметричное шифрование и подписи так распостранены -- потому что вероятность подбора исчезающе мала.
     
  9. medbrat

    medbrat Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    Да, конкурсы устраивают, с 1987 года есть один конкурс, который до сих пор никто не может решить.) Просто пробовал другие числа, знаки не те получаются, крякозябры, значит есть возможность определения алгоритма и написания какой-нибудь функции. Скажу сразу - у меня есть товарищ, который решил эту задачу очень просто и не хочет мне говорить как, а я всё ломаю над этим голову))
     
  10. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    я чтот не понял, это уже вторая задача?: у тебя есть md5 хэш и ты хочешь подобрать исходное сообщение которое даёт такой хэш?

    или я что-то не вкуриваю.

    Недавно на паскале писал шифрование алгоритма TEA (Сеть Фейштеля)
    Процедуры кодирования декодирования:
    Код (Text):
    1. procedure EnCrypt(var data);
    2.     var X1,X2,X3,X4,X5,sum : longint;
    3. begin
    4.     sum := 0;
    5.     X1 := TBlock(data)[1];
    6.     X2 := TBlock(data)[2];
    7.     X3 := TBlock(data)[3];
    8.     X4 := TBlock(data)[4];
    9.     X5 := TBlock(data)[5];
    10.     for a := 1 to  32 do
    11.     begin
    12.         sum := sum + delta;
    13.         X1 := X1 + ( ( (X2 shl 4) + Key[1] ) xor ( X2+sum ) xor ( (X2 shr 5) + Key[2]) );
    14.         X2 := X2 + ( ( (X3 shl 4) + Key[1] ) xor ( X3+sum ) xor ( (X3 shr 5) + Key[2]) );
    15.         X3 := X3 + ( ( (X4 shl 4) + Key[1] ) xor ( X4+sum ) xor ( (X4 shr 5) + Key[2]) );
    16.         X4 := X4 + ( ( (X5 shl 4) + Key[1] ) xor ( X5+sum ) xor ( (X5 shr 5) + Key[2]) );
    17.         X5 := X5 + ( ( (X1 shl 4) + Key[3] ) xor ( X1+sum ) xor ( (X1 shr 5) + Key[4]) );
    18.     end;
    19.     TBlock(data)[1] := X1;
    20.     TBlock(data)[2] := X2;
    21.     TBlock(data)[3] := X3;
    22.     TBlock(data)[4] := X4;
    23.     TBlock(data)[5] := X5;
    24. end;
    25.  
    26.  
    27. procedure DeCrypt(var data);
    28.     var X1,X2,X3,X4,X5,sum : longint;
    29. begin
    30.     sum := $C6EF3720;
    31.     X1 := TBlock(data)[1];
    32.     X2 := TBlock(data)[2];
    33.     X3 := TBlock(data)[3];
    34.     X4 := TBlock(data)[4];
    35.     X5 := TBlock(data)[5];
    36.     for a := 1 to  32 do
    37.     begin
    38.         X5 := X5 - ( ( (X1 shl 4) + Key[3] ) xor ( X1+sum ) xor ( (X1 shr 5) + Key[4]) );
    39.         X4 := X4 - ( ( (X5 shl 4) + Key[1] ) xor ( X5+sum ) xor ( (X5 shr 5) + Key[2]) );
    40.         X3 := X3 - ( ( (X4 shl 4) + Key[1] ) xor ( X4+sum ) xor ( (X4 shr 5) + Key[2]) );
    41.         X2 := X2 - ( ( (X3 shl 4) + Key[1] ) xor ( X3+sum ) xor ( (X3 shr 5) + Key[2]) );
    42.         X1 := X1 - ( ( (X2 shl 4) + Key[1] ) xor ( X2+sum ) xor ( (X2 shr 5) + Key[2]) );
    43.         sum := sum - delta;
    44.     end;
    45.     TBlock(data)[1] := X1;
    46.     TBlock(data)[2] := X2;
    47.     TBlock(data)[3] := X3;
    48.     TBlock(data)[4] := X4;
    49.     TBlock(data)[5] := X5;
    50. end;
    Всё зашифровывает и расшифровывает...
    Пожалуйста объясни свою задачу понятней, я по несколько раз перечитываю и нифига не вкуриваю, хотя как видишь совсем недавно на практике занимался криптографией.
     
  11. medbrat

    medbrat Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    Всё просто, это не вторая, а одна и та же задача.
    Да! Абсолютно верно!

    Код (Text):
    1. private function prove($message, $signature) {
    2.  
    3.         $coded = explode(" ", $signature);
    4.         $mesage = "";
    5.         $max = count($coded);
    6.         $n = "34483243243248381";
    7.         $i = 0;
    8.         while ($i < $max)
    9.         {
    10.             $code = bcmod(bcpow($coded[$i], "5", 0), $n);
    11.             $i++;
    12.             while (bccomp($code, "0") != 0)
    13.             {
    14.                 $ascii = bcmod($code, "256");
    15.                 $code = bcdiv($code, "256", 0);
    16.                 $mesage1 .= chr($ascii);
    17.                 continue;
    18.             }
    19.             continue;
    20.         }
    21.         return $mesage1 == md5($message2);
    22.     }
    Функция проверяет является ли 1 сообщение равным 2 сообщению. 2 сообщение это просто адрес сайта и дата, я знаю в каком оно должно быть формате и соответственно могу написать любую дату, захешировать в md5 и теперь мне нужно подобрать её в "численном выражении, т.к. по этой функции уже известное численное сообщение с "устаревшей датой" равно "14001343445167338 5824865800319137 8697685512950663 8535433360079566 15967452656546222 20282029223956019 11460306196490294 12915957959486199 383526302010857 20093916592345963 4982076265770298" что в разборе даёт:

    Код (Text):
    1. 4
    2. 4b
    3. 4ba
    4. 4ba6
    5. 4ba61
    6. 4ba613
    7. 4ba613f
    8. 4ba613f3
    9. 4ba613f3e
    10. 4ba613f3e9
    11. 4ba613f3e92
    12. 4ba613f3e921
    13. 4ba613f3e921b
    14. 4ba613f3e921ba
    15. 4ba613f3e921bab
    16. 4ba613f3e921bab4
    17. 4ba613f3e921bab4d
    18. 4ba613f3e921bab4dc
    19. 4ba613f3e921bab4dc6
    20. 4ba613f3e921bab4dc60
    21. 4ba613f3e921bab4dc601
    22. 4ba613f3e921bab4dc6013
    23. 4ba613f3e921bab4dc6013c
    24. 4ba613f3e921bab4dc6013cb
    25. 4ba613f3e921bab4dc6013cb8
    26. 4ba613f3e921bab4dc6013cb8a
    27. 4ba613f3e921bab4dc6013cb8a2
    28. 4ba613f3e921bab4dc6013cb8a21
    29. 4ba613f3e921bab4dc6013cb8a21b
    30. 4ba613f3e921bab4dc6013cb8a21b8
    31. 4ba613f3e921bab4dc6013cb8a21b87
    32. 4ba613f3e921bab4dc6013cb8a21b878
    33. 4ba613f3e921bab4dc6013cb8a21b878
    34. - ЕСЛИ ОНИ ОДИНАКОВЫ, ТО ВСЁ ВЕРНО(НИЖЕ СООБЩЕНИЕ md5($message2))
    35. 4ba613f3e921bab4dc6013cb8a21b878
    Причём, если я меняю в первом блоке цифр "14001222445167338" на "24001222445167338", то мне выдаются "крякозябры", значит эта функция работает по какой-то логике и подобрать её будет проще, а в самом начале я пытался решить задачу не "подбора", а хотел "повернуть функцию обратно", но поскольку обратных функций не существует, то прийдётся подобрать, но по "логике" например указать php что нужно при подборе цифр использовать нужный алгоритм, как это сделать, сейчас думаю.
     
  12. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    Из блоков цифр (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, а хрень какая-то )
     
  13. medbrat

    medbrat Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    На данном этапе я имею целый набор расшифрованных (более 1000 сообщений), задача сводится только к тому, чтобы написать правильный алгоритм определения матрицы.

    Добавлено спустя 29 минут 59 секунд:
    Например, мне изначально известно как генерируются несколько комбинаций:

    Код (Text):
    1.  
    2. 1623d56364563666bdec2e6e1b36481b
    3. 6a01a8a354682e088adff815e0a5e
    4. 41fffc5953466ff6fff573191f61864 и т.д.
    Мне нужно сгенерировать комбинацию: "988192b1a609aeacc6fff17a3291d3d"

    Методом поиска я уже нашёл несколько идентичных "тройных" комбинаций, но если бы была матрица, то мог бы генерировать их сколько угодно, а не искать..

    $mesage == md5($message); - это единственное что имеется в защите, исходный код у меня есть и полностью открыт. Да, это RSA-алгоритм, придуман в 1970 годах и пользуется популярностью до сих пор. Считается одним из самых криптоустойчивых алгоритмов.
     
  14. Yadfewm

    Yadfewm Активный пользователь

    С нами с:
    20 июл 2009
    Сообщения:
    223
    Симпатии:
    0
    вернее не "как", а из чего?

    можешь скинуть сюды из чего комбинируется каждая вышеприведенная строчка и скрипт кодирования если есть поподробнее, хотя вроде всё есть.

    эээ это не генерация каких-нибудь там ключей к проге? например photoshop? Мож это сигнализация какая нить от тачки? Или от метро карточки? Не? =D кались

    Добавлено спустя 2 минуты 49 секунд:
    аа, чо-то там домен и время, мммм на пароли не похоже... ммм
     
  15. medbrat

    medbrat Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    7
    Симпатии:
    0
    Вот код, декодирования и кодирования, кодирование почему-то не работает, последнее звено не получается.

    Код (Text):
    1. $m = "";
    2.     $e = "5";
    3.     $s = "3";
    4.         $n = '34483243243248381';
    5.         $coded   = '';
    6.         $max     = strlen($m);
    7.         $packets = ceil($max/$s);
    8.        
    9.         for($i=0; $i<$packets; $i++){
    10.             $packet = substr($m, $i*$s, $s);
    11.             $code   = '0';
    12.  
    13.             for($j=0; $j<$s; $j++){
    14.                 $code = bcadd($code, bcmul(ord($packet[$j]), bcpow('256',$j)));
    15.             }
    16.  
    17. #$code   = bcpowmod($code, $e, $n); //НЕ РАБОТАЕТ
    18.             $coded .= $code.' ';
    19.         }
    20.  
    21.        $coded2 = trim($coded);
    22.    
    23.         print_r($coded2);
    Здесь всё работает:

    Код (Text):
    1. $s1 = '';  
    2.  
    3.         $coded   = split(' ', $s1);
    4.         $message = '';
    5.         $n = '34483243243248381';
    6.         $max     = count($coded);
    7.  
    8.         for($i=0; $i < $max; $i++){
    9.             $code1 = bcpow($coded[$i], "5", 0);
    10.             $code2 = bcdiv($code1, $n);
    11.             $code3 = bcmul($code2, $n);
    12.             $code = bcmod($code1, $n);
    13.  
    14.             while(bccomp($code, '0') != 0){
    15.                 $ascii    = bcmod($code, '256');
    16.                 $code     = bcdiv($code, '256', 0);
    17.                 $mesage .= chr($ascii);
    18.                  print_r($mesage);
    19.          echo "<br />";
    20.              }
    21.         }
    22.  
    23.  
    24.        
    25.         print_r($mesage);
    26.         echo "<br />";