eXeL@B —› Программирование —› Помогите обратить функцию |
Посл.ответ | Сообщение |
|
Создано: 30 января 2007 20:15 · Поправил: HOMEZ · Личное сообщение · #1 Помогите обратить эту функцию, если конешно этото вообще возможно. public uint calс( uint a, uint b, uint c )
Чтобы зная b, c и её результат, получить a. |
|
Создано: 30 января 2007 23:09 · Личное сообщение · #2 |
|
Создано: 30 января 2007 23:18 · Поправил: Archer · Личное сообщение · #3 На первый взляд (может и ошибаюсь), тут не биективно, на один и тот же набор b,c и результат может быть несколько а. Тогда получить исходное а не получится. В принципе можно брутить, брут быстрый. Вообще говоря, похоже на возведение в степень, осталось только прогнать через компилятор и проверить. Если это так, то решай сравнение, алгоритмы на это дело в принципе есть. |
|
Создано: 31 января 2007 01:01 · Поправил: tundra37 · Личное сообщение · #4 HOMEZ пишет: если конешно этото вообще возможно. Если ты нигде не ошибся, то для 32 битов дискретный лограрифм ищется быстро. Ищи в форуме по слову calculus - но пока что-то никому не удалось перекомпилировать ее. Все нужные библиотеки есть у меня в архивах. Т.е. ответ такой - возможно, но не тривиально. Ну и можно брутить. Для 32 - это еще реально, но быстрый алгоритм тянет до 98 битов и выше. Брут уже затруднителен в этом случае. |
|
Создано: 31 января 2007 04:35 · Личное сообщение · #5 |
|
Создано: 31 января 2007 06:25 · Личное сообщение · #6 |
|
Создано: 31 января 2007 07:49 · Личное сообщение · #7 |
|
Создано: 31 января 2007 07:50 · Личное сообщение · #8 |
|
Создано: 02 февраля 2007 11:42 · Личное сообщение · #9 |
|
Создано: 02 февраля 2007 12:43 · Личное сообщение · #10 |
|
Создано: 02 февраля 2007 15:14 · Личное сообщение · #11 ну если эта функция не обратима то тогда как сервер игры узнает e2 при условии что используя эту функцию клиент считают d = rand() e1 = calc( d, a, c ) e2 = calc( d, b, c ) при этом серваку отдается e1 и он возвращает e2, но он не знает чему был равен d. как вычислить e2, зная что числа для примера, они реальные но всегда меняются. a = 0x3132a5cd b = 0x003ad24f c = 0x38519c53 e1 =0x2f66516d должно же быть какоето решение |
|
Создано: 02 февраля 2007 15:54 · Личное сообщение · #12 |
|
Создано: 03 февраля 2007 04:54 · Личное сообщение · #13 HOMEZ при этом серваку отдается e1 и он возвращает e2, но он не знает чему был равен d То есть получается клиент генерирует случайное d, посылает a^d mod c, а сервер возвращает b^d mod c, так? Откуда берутся a и b - сервер их знает? Просто тогда или 1) a*b=1 mod c и задача решается тривиально, но непонятно, зачем огород городить, или 2) ты что-то путаешь В нахождение сервером дискретного логарифма поверить сложно. |
|
Создано: 03 февраля 2007 05:34 · Поправил: HOMEZ · Личное сообщение · #14 Stiver пишет: В нахождение сервером дискретного логарифма поверить сложно. я знаю что сложно, оноже както работает ) сервер выдает а, b и с. клиент генерит e1 и e2( сохраняет для проверки ) отправляет e1 серваку получает от него e2, сравнивает с ранее вычисленным если совпало , то все харашо. ну правда там еще Blowfish, и какойто забавный XOR. участвуют, но это к делу не относится тк тут все прозрачно. |
|
Создано: 03 февраля 2007 07:24 · Личное сообщение · #15 |
|
Создано: 03 февраля 2007 08:02 · Личное сообщение · #16 |
|
Создано: 04 февраля 2007 01:43 · Поправил: tundra37 · Личное сообщение · #17 HOMEZ пишет: я никогда до этого не сталкивался с дискретным логарифмом Нужно сначала освоить азы теории чисел. Либо попытаться "вслепую" Index calculus собрать и запустить. Ну и кстати про f - это только гипотеза. Просто a*b=1 не подходит. Забыл - для 32 бит можно найти f полным перебором. Даже без оптимизации - не больше часа. Кстати, для простых a c вроде решение должно всегда существовать. b - любое. Приведенные в примере числа - все простые. |
|
Создано: 04 февраля 2007 07:20 · Личное сообщение · #18 |
eXeL@B —› Программирование —› Помогите обратить функцию |