Рейтинг:0

Фальсификация обязательств Педерсена

флаг in

Сегодня я нашел Веб-сайт для схемы обязательств Педерсена; тем не менее, генераторы г и час не являются независимыми, и поэтому доказывающий может открыть обязательство с многими способами. Я вычислил обязательство с для сообщения м и случайность р (при условии, что я знаю с):

с = г ^ м * ч ^ г 

   = г ^ м * (г ^ с) ^ г 

   = г ^ м * (г ^ (с * г))

   = г ^ (м + с * г) 

Скажем, я совершил сообщение м, случайность р, а обязательство с (с = г ^ (м + с * г). Теперь я хочу подделать его, т. е. открыть его для какого-то другого сообщения. м', не равно м, и поэтому мне нужно вычислить новую случайность р': r' = (m - m' + s * r) * s^(-1). Я взял исходный код Python, разместил его на сайте и сделал небольшую модификацию, вернув с. Более того, я написал еще одну функцию поддельное_сообщение для вычисления произвольного сообщения для его открытия с тем же обязательством c, но когда я запускаю свой измененный код, последняя строка,

r2 = печать (vv.open (параметр, c, m2, r2))

возвращает ложь. Мой вопрос: что не так с моим мышлением и реализацией Python? (Я использую pycryptodome 3.10.1)

из крипто импорта Random
из номера импорта Crypto.Util
импорт системы

деф генерировать (параметр):
      р = параметр[0]
      д = параметр[1]
      г = параметр[2]
      ч = параметр[3]
      с = параметр[4]
      вернуть p,q,g,h,s

верификатор класса:
    настройка защиты (я, безопасность):
        p = number.getPrime(2 * безопасность, Random.new().read)
        q = 2*p + 1 # хм, нет проверки, является ли q простым или нет.

        g = число.getRandomRange(1, q-1)
        s = число.getRandomRange(1, q-1)
        print("Секретное значение:\t",s)
        ч = pow (g, s, q)
        
        параметр = (p,q,g,h,s)
        распечатать("р=",р)
        распечатать("q=",q)
        печать("г=",г)
        распечатать("ч=",ч)
        распечатать("с=",с)

        возвращаемый параметр

    def open(self, param, c, m, r):
        p, q, g, h, s = генерировать (параметр)
        res = (pow(g,m,q) * pow(h,r,q)) % q

        возврат (с == рез)

        
прувер класса: 
    def commit(self, param, m):
        p, q, g, h, s = генерировать (параметр)
        
        г = число.getRandomRange(1, q-1)
        c = (pow(g,m,q) * pow(h,r,q)) % q
        возврат с, р

    # Я собираюсь открыть его для случайного произвольного сообщения m2
    def fake_message(self, param, c, m1, r1):
        p, q, g, h, s = генерировать (параметр)

        #получить случайное сообщение
        m2 = число.getRandomRange(1, q-1)
        r2 = ((m1 - m2 + s * r1) * number.inverse(s, q))%q
        возврат (м2, г2)




безопасность = 80
м = 2

vv = верификатор ()
пп = прувер ()

параметр = vv.setup(безопасность)

c, r = pp.commit(param, m)
печать (vv.open (параметр, c, m, r))
m2, r2 = pp.fake_message(параметр, c, m, r)
печать (vv.open (параметр, c, m2, r2))
Daniel S avatar
флаг ru
Проблема заключается в выражении `number.inverse(s,q)`, а также `%q`. Вам нужно вычислить обратное значение $s$ по модулю порядка мультипликативной группы $q$, а не по модулю $q$ (аналогично, окончательная редукция не должна быть по модулю $q$). Если $q$ простое число, то порядок равен $q-1$, но, как вы правильно заметили, этот код не проверяет, является ли $q$ простым. Чтобы исправить, добавьте проверку того, что $q$ является простым, а затем измените на `((m1 - m2 + s * r1) * number.inverse(s, q-1))%(q-1)`
флаг in
Спасибо @DanielS.

Ответить или комментировать

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