Am aceasta problema:
Am și versiunea python a acestei probleme aici:
import json
import sys, os, itertools
sys.path.append(os.path.abspath(os.path.join('..')))
din playcrypt.tools import *
din playcrypt.new_tools import *
din playcrypt.primitives import *
din playcrypt.games.game_bind import GameBIND
din playcrypt.simulator.bind_sim import BINDSim
din playcrypt.games.game_hide import GameHIDE
din playcrypt.simulator.hide_sim import HIDESim
def ADD(a,b):
returnează a+b
def MULT(a,b):
întoarce a*b
def INT_DIV(a,N):
return (a//N, a%N)
def MOD(a,N):
returnează un%N
def EXT_GCD(a,N):
returnează egcd(a,N)
def MOD_INV(a,N):
res = modinv(a,N)
if res == Nici unul:
raise ValueError ("Inversul nu există.")
returnare res
def MOD_EXP(a,n,N):
returnează exp(a,n,N)
"""
Fie p un prim cu lungimea de biți k >= 8 astfel încât (p - 1)/2 este de asemenea prim. Fie g,
h fie doi generatori diferiți ai grupului G = Z_p^*. Fie CS= (P, C, V)
schemă de angajament ai cărei algoritmi consituenți sunt după cum urmează, unde mesajul
M este în Z_{p-1}:
"""
def P():
pi = (g, h)
return pi
def C(pi, M):
"""
:param pi: Parametri publici
:param M: Mesajul care urmează să fie comis, element din Z_{p-1}
:return: returnează cheia de commital și decommital
"""
(g, h) = pi
K = aleatoriu_Z_N(p-1)
A = MOD_EXP(g, K, p)
B = MOD_EXP(h, M, p)
C_1 = MOD(A*B, p)
C_2 = MOD(M+K, p-1)
întoarcere ((C_1, C_2), K)
def V(pi, C, M, K):
"""
:param pi: Parametri publici
:param C: Angajarea
:param M: Mesajul de verificat
:param K: Cheia de dezagajare
:return: returneaza 1 daca deschiderea este valabila si 0 in caz contrar
"""
(g, h) = pi
(C_1, C_2) = C
dacă nu 0 <= K < p-1 sau nu 0 <= M < p-1:
întoarce 0
A = MOD_EXP(g, K, p)
B = MOD_EXP(h, M, p)
C_1_prim = MOD(A*B, p)
C_2_prim = MOD(M+K, p-1)
dacă (C_1 == C_1_prim) și (C_2 == C_2_prim):
întoarce 1
altceva:
întoarce 0
"""
1. Specificați un adversar de timp O(k^3) A1 care face o interogare la oracolul său LR și
realizând Adv^{hide}_CS(A1) = 1.
"""
def A1(lr, pi):
"""
Acesta este adversarul care este problema
solicitând. Ar trebui să returneze 0 sau 1.
:param lr: Oracolul furnizat de jocul HIDE
:param pi: Parametrul public pi
"""
trece
"""
2. Specificați un adversar de timp O(k) A2 astfel încât Adv^{bind}_CS(A2) = 1.
(Sugestie: Care este valoarea lui g^{(p-1)/2} mod p și de ce?)
"""
def A2(pi):
"""
Acesta este adversarul care este problema
solicitând. Ar trebui să returneze tuplu (C, M_0, M_1, K_0, K_1).
:param pi: Parametrul public pi
"""
întoarcere ((0, 0), 0, 0, 0, 0)
if __name__ == '__main__':
# Eșantion de parametri aleatori
k = 12
print('Eșantionarea parametrilor aleatori cu lungimea de biți k = %d' % k)
p = aleatoriu.randint(2**(k - 1), 2**k)
în timp ce nu este_prim(p) sau nu este_prim((p-1)//2):
p = aleatoriu.randint(2**(k - 1), 2**k)
g = random_Z_N_star(p)
în timp ce (MOD_EXP(g, (p-1)//2, p) == 1) sau (MOD_EXP(g, 2, p) == 1):
g = random_Z_N_star(p)
h = random_Z_N_star(p)
în timp ce (h == g) sau (MOD_EXP(h, (p-1)//2, p) == 1) sau (MOD_EXP(h, 2, p) == 1):
h = random_Z_N_star(p)
print('p = %d, g = %d, h = %d' % (p, g, h))
game_hide = GameHIDE(P, C)
sim_hide = HIDESim(game_hide, A1)
game_bind = GameBIND(P, V)
sim_bind = BINDSim(game_bind, A2)
print("Avantajul adversarului tău A1 este de aprox. " + str(sim_hide.compute_advantage()))
print("Avantajul adversarului tău A2 este de aprox. " + str(sim_bind.compute_advantage()))
Complet pierdut, cum să încep?