Puncte:0

Falsificarea angajamentului Pedersen

drapel in

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))
Daniel S avatar
drapel ru
Problema este expresia `number.inverse(s,q)` și, de asemenea, `%q`. Trebuie să calculați inversul lui $s$ modulo ordinea grupului multiplicativ al lui $q$ nu modulo $q$ (la fel și reducerea finală nu ar trebui să fie modulo $q$). Dacă $q$ este prim, ordinea este $q-1$, dar după cum ați observat corect, acest cod nu verifică dacă $q$ este prim. Pentru a remedia adăugați o verificare că $q$ este prim și apoi schimbați în `((m1 - m2 + s * r1) * number.inverse(s, q-1))%(q-1)`
drapel in
Mulțumesc @DanielS.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.