Astăzi, am găsit un site-ul web pentru schema de angajament Pedersen; cu toate acestea, generatoarele g
și h
nu sunt independenți și, prin urmare, un probator poate deschide un angajament c
în multe feluri. Am calculat angajamentul c
pentru un mesaj m
și o aleatorie r
(presupunând că știu s
):
c = g^m * h^r
= g^m * (g^s)^r
= g^m * (g^(s * r))
= g^(m + s * r)
Spune, m-am angajat la mesaj m
, aleatoriu r
, iar angajamentul este c
(c = g ^ (m + s * r)
. Acum vreau să-l falsesc, adică să-l deschid pentru un alt mesaj m'
, nu este egal cu m
, și, prin urmare, trebuie să calculez o nouă aleatorie r'
: r' = (m - m' + s * r) * s^(-1)
. Am luat codul original python, l-am postat pe site și am făcut o modificare minoră, revenind s
. Mai mult, am mai scris o funcție mesaj_fals pentru a calcula un mesaj arbitrar pentru deschiderea acestuia la același angajament c, dar când rulez codul meu modificat, ultima linie,
r2 = print(vv.open(param, c, m2, r2))
se întoarce fals. Întrebarea mea este: ce este în neregulă cu gândirea mea și cu implementarea Python? (Folosesc pycryptodome 3.10.1)
din Crypto import Random
de la numărul de import Crypto.Util
import sys
def generate(param):
p = param[0]
q = param[1]
g = param[2]
h = param[3]
s = param[4]
returnează p,q,g,h,s
verificator de clasa:
def setup(self, security):
p = number.getPrime(2 * securitate, Random.new().read)
q = 2*p + 1 # hmm, nu se testează dacă q este prim sau nu.
g = număr.getRandomRange(1, q-1)
s = număr.getRandomRange(1, q-1)
print("Valoare secreta:\t",s)
h = pow(g,s,q)
param = (p,q,g,h,s)
print("p=",p)
print("q=",q)
print("g=",g)
print("h=",h)
print("s=",s)
return param
def open(self, param, c, m, r):
p,q,g,h,s = genera(param)
res = (pow(g,m,q) * pow(h,r,q)) % q
return (c == res)
doveditor de clasă:
def commit(self, param, m):
p,q,g,h,s= generate(param)
r = număr.getRandomRange(1, q-1)
c = (pow(g,m,q) * pow(h,r,q)) % q
întoarce c, r
# Îl voi deschide la un mesaj arbitrar aleatoriu m2
def fake_message(self, param, c, m1, r1):
p,q,g,h,s = genera(param)
#primiți un mesaj aleatoriu
m2 = număr.getRandomRange(1, q-1)
r2 = ((m1 - m2 + s * r1) * număr.invers(e, q))%q
întoarcere (m2, r2)
securitate = 80
m = 2
vv = verificator()
pp = doveditor()
param = vv.setup(securitate)
c, r = pp.commit(param, m)
print(vv.open(param, c, m, r))
m2, r2 = pp.fake_message(param, c, m, r)
print(vv.open(param, c, m2, r2))