Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Помогите обратить функцию
Посл.ответ Сообщение

Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 30 января 2007 20:15 · Поправил: HOMEZ
· Личное сообщение · #1

Помогите обратить эту функцию, если конешно этото вообще возможно.
public uint calс( uint a, uint b, uint c )
{
if( a == 0 )
return 1;
ulong result = 1;
ulong temp = b;

while( a != 0 )
{
if( ( a & 1 ) == 1 )
{
result = ( temp * result ) % (ulong)c;
}
a >>= 1;
temp = (ulong)((ulong)temp * (ulong)temp ) % (ulong)c;
}
return (uint)( result & 0xFFFFFFFF );
}


Чтобы зная b, c и её результат, получить a.



Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 30 января 2007 23:09
· Личное сообщение · #2

HOMEZ

Если не ошибаюсь, то функция calс - просто хитро записанное возведение в степень b^a mod c. То есть нужно вычислять логарифм.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 30 января 2007 23:18 · Поправил: Archer
· Личное сообщение · #3

На первый взляд (может и ошибаюсь), тут не биективно, на один и тот же набор b,c и результат может быть несколько а. Тогда получить исходное а не получится. В принципе можно брутить, брут быстрый.
Вообще говоря, похоже на возведение в степень, осталось только прогнать через компилятор и проверить. Если это так, то решай сравнение, алгоритмы на это дело в принципе есть.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 31 января 2007 01:01 · Поправил: tundra37
· Личное сообщение · #4

HOMEZ пишет:
если конешно этото вообще возможно.

Если ты нигде не ошибся, то для 32 битов дискретный лограрифм ищется быстро. Ищи в форуме по слову calculus - но пока что-то никому не удалось перекомпилировать ее. Все нужные библиотеки есть у меня в архивах. Т.е. ответ такой - возможно, но не тривиально.
Ну и можно брутить. Для 32 - это еще реально, но быстрый алгоритм тянет до 98 битов и выше. Брут уже затруднителен в этом случае.




Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 31 января 2007 04:35
· Личное сообщение · #5

длп... давай числа. могу залить солвер(поллард)

-----
Тут не могла быть ваша реклама




Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 31 января 2007 06:25
· Личное сообщение · #6

tundra37 пишет:
Ищи в форуме по слову calculus - но пока что-то никому не удалось перекомпилировать ее.

не совсем верное утверждение



Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 31 января 2007 07:49
· Личное сообщение · #7

а чем мне этот calculus поможет?




Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 31 января 2007 07:50
· Личное сообщение · #8

ssx пишет:
не совсем верное утверждение

+1
и это.. index calculus не всегда рулит.. чаще поллард справляется очень быстро - все зависит от чисел..

-----
Тут не могла быть ваша реклама




Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 02 февраля 2007 11:42
· Личное сообщение · #9

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



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 02 февраля 2007 12:43
· Личное сообщение · #10

см. ответ Stiver: "функция calс - просто хитро записанное возведение в степень b^a mod c."
"он делает" возведение в степень по модулю



Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 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

должно же быть какоето решение



Ранг: 39.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 02 февраля 2007 15:54
· Личное сообщение · #12

написали же, это DLP. проблема дискретного логарифма и она разрешаема (в разумных пределах =) )



Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 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) ты что-то путаешь В нахождение сервером дискретного логарифма поверить сложно.



Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 03 февраля 2007 05:34 · Поправил: HOMEZ
· Личное сообщение · #14

Stiver пишет:
В нахождение сервером дискретного логарифма поверить сложно.


я знаю что сложно, оноже както работает )

сервер выдает а, b и с.
клиент генерит e1 и e2( сохраняет для проверки )
отправляет e1 серваку
получает от него e2,
сравнивает с ранее вычисленным
если совпало , то все харашо.

ну правда там еще Blowfish, и какойто забавный XOR.
участвуют, но это к делу не относится тк тут все прозрачно.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 03 февраля 2007 07:24
· Личное сообщение · #15

HOMEZ пишет:
я знаю что сложно, оноже както работает )

Если b=a^f mod c , то e2=e1^f mod c
Т.е. приехали туда же - дискретный логарифм.



Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 03 февраля 2007 08:02
· Личное сообщение · #16

тогда как узнать это пресловутое f.
особенно если принять во внимание что я никогда до этого не сталкивался с дискретным логарифмом



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 04 февраля 2007 01:43 · Поправил: tundra37
· Личное сообщение · #17

HOMEZ пишет:
я никогда до этого не сталкивался с дискретным логарифмом

Нужно сначала освоить азы теории чисел. Либо попытаться "вслепую" Index calculus собрать и запустить.
Ну и кстати про f - это только гипотеза. Просто a*b=1 не подходит.
Забыл - для 32 бит можно найти f полным перебором. Даже без оптимизации - не больше часа.
Кстати, для простых a c вроде решение должно всегда существовать. b - любое.
Приведенные в примере числа - все простые.



Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 04 февраля 2007 07:20
· Личное сообщение · #18

ну я вчера простым перебором от 0 до FFFFFFFF попереберал, 40 минут.
ты прав оказался насчет, tundra37 пишет:
Если b=a^f mod c , то e2=e1^f mod c


и получилось, что f тоже рандомное значение
и незная его, е2 быстро не получить

жаль, а так хотелось ботика накатать


 eXeL@B —› Программирование —› Помогите обратить функцию
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати