Сегодня я нашел Веб-сайт для схемы обязательств Педерсена; тем не менее, генераторы г
и час
не являются независимыми, и поэтому доказывающий может открыть обязательство с
многими способами. Я вычислил обязательство с
для сообщения м
и случайность р
(при условии, что я знаю с
):
с = г ^ м * ч ^ г
= г ^ м * (г ^ с) ^ г
= г ^ м * (г ^ (с * г))
= г ^ (м + с * г)
Скажем, я совершил сообщение м
, случайность р
, а обязательство с
(с = г ^ (м + с * г)
. Теперь я хочу подделать его, т. е. открыть его для какого-то другого сообщения. м'
, не равно м
, и поэтому мне нужно вычислить новую случайность р'
: 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))