вычисление ((a^z1)(y^z2)mod(p))mod(q)

Тема в разделе "WASM.ASSEMBLER", создана пользователем yureckor, 14 июл 2005.

  1. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    собственно в ГОСТ'е 34.10-94 есть в конце такая формула проверки электронной подписи:

    ((a^z1)(y^z2)mod(p))mod(q)

    Но числа 256 и 512 битные, поэтому обычное возведение a^z1 или y^z2 вроде как не реально.



    Алгоритм вычисления (a^x) mod (p) есть.

    Есть ли алгоритм для (a^z1)(y^z2)mod(p) ?
     
  2. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    ((a^z1) * (y^z2)) mod p == ( ((a^z1) mod p) * (y^z2) mod p) ) mod p
     
  3. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    yureckor



    Там все вычисления (включая возведение в степень) выполняются в GF(p). Поэтому всё "реально".



    Если у тебя есть алгоритм для возведения в степень в GF(p), то там должна быть и реализация обычного умножения. Так что у тебя всё есть. ;) Алгоритмы можно было взять из реализаций ElGamal, Р 34.10-94 из той же оперы. Я бы на твоем месте не парился, а скачал бы какую-нибудь программу, использующую 34.10-94 и получил бы хорошие исходники на ассемблере. ;->
     
  4. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    flankerx

    спасибо, я правда сам к вечеру додумался.



    _BC_

    >всё "реально"

    нигде в расчетах нет a^x, есть только a^x mod n.

    А для представления (0..2^256)^(0..2^256) памяти даже не хватит (если для 2^256 надо 32байта=степень/8, то (2^256)/8=1.447e+76 байт).

    Насчет остального: за 1.5 недели я перерыл иного инета, ГОСТ'ов нормальных нет (из-за этого так долго и делал).

    >получил бы хорошие исходники на ассемблере

    Самое лучшее, что я нашел, было на Яве :)



    Да я собственно все сделал, часть процедур взял из "rsa для программиста" by z0mbie, часть (хеш) из x86hotk100 by Anatoly Kaluzhinsky. Пока разбирался как прикрутить, понял как работает :)

    Но похоже где то в арифметике ошибка, у меня в конце проверка не сходится.