Tôi có vấn đề này:
Tôi cũng có phiên bản python của vấn đề này ở đây:
nhập json
nhập sys, os, itertools
sys.path.append(os.path.abspath(os.path.join('..')))
từ playcrypt.tools nhập *
từ playcrypt.new_tools nhập *
từ playcrypt.primitives nhập *
từ playcrypt.games.game_bind nhập GameBIND
từ playcrypt.simulator.bind_sim nhập BINDSim
từ playcrypt.games.game_hide nhập GameHIDE
từ playcrypt.simulator.hide_sim nhập HIDESim
xác định THÊM(a,b):
trả về a+b
def MULT(a,b):
trả lại a*b
định nghĩa INT_DIV(a,N):
trả về (a//N, a%N)
def MOD(a,N):
trả lại một%N
def EXT_GCD(a,N):
trả về egcd(a,N)
def MOD_INV(a,N):
res = modinv(a,N)
nếu res == Không có:
nâng cao ValueError ("Nghịch đảo không tồn tại.")
trả lại độ phân giải
def MOD_EXP(a,n,N):
trả về exp(a,n,N)
"""
Cho p là số nguyên tố có độ dài bit k >= 8 sao cho (p - 1)/2 cũng là số nguyên tố. Đi thôi,
h là hai trình tạo khác nhau của nhóm G = Z_p^*. Đặt CS= (P, C, V) là
lược đồ cam kết có các thuật toán cấu thành như sau, trong đó thông báo
M nằm trong Z_{p-1}:
"""
chắc chắn P():
pi = (g, h)
trả lại số pi
định nghĩa C(pi, M):
"""
:param pi: Tham số công khai
:param M: Thông báo được chuyển giao, phần tử của Z_{p-1}
:return: trả lại khóa cam kết và khóa mã hóa
"""
(g, h) = pi
K = ngẫu nhiên_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)
trả về ((C_1, C_2), K)
def V(pi, C, M, K):
"""
:param pi: Tham số công khai
:param C: Cam kết
:param M: Tin nhắn cần xác minh
:param K: Khóa dấu phẩy
:return: trả về 1 nếu mở hợp lệ và 0 nếu ngược lại
"""
(g, h) = pi
(C_1, C_2) = C
nếu không 0 <= K < p-1 hoặc không 0 <= M < p-1:
trả về 0
A = MOD_EXP(g, K, p)
B = MOD_EXP(h, M, p)
C_1_prime = MOD(A*B, p)
C_2_prime = MOD(M+K, p-1)
nếu (C_1 == C_1_prime) và (C_2 == C_2_prime):
trả lại 1
khác:
trả về 0
"""
1. Chỉ định đối thủ có thời gian O(k^3) A1 thực hiện một truy vấn tới tiên tri LR của nó và
đạt được Adv^{hide}_CS(A1) = 1.
"""
định nghĩa A1(lr, pi):
"""
Đây là đối thủ mà vấn đề là
yêu cầu. Nó sẽ trả về 0 hoặc 1.
:param lr: Oracle được cung cấp bởi game HIDE
:param pi: Tham số công khai pi
"""
vượt qua
"""
2. Chỉ định một đối thủ theo thời gian O(k) A2 sao cho Adv^{bind}_CS(A2) = 1.
(Gợi ý: Giá trị của g^{(p-1)/2} mod p là gì và tại sao?)
"""
định nghĩa A2(pi):
"""
Đây là đối thủ mà vấn đề là
yêu cầu. Nó sẽ trả về bộ dữ liệu (C, M_0, M_1, K_0, K_1).
:param pi: Tham số công khai pi
"""
trả về ((0, 0), 0, 0, 0, 0)
nếu __name__ == '__main__':
# Tham số mẫu ngẫu nhiên
k = 12
print('Lấy mẫu tham số ngẫu nhiên độ dài bit k = %d' % k)
p = ngẫu nhiên.randint(2**(k - 1), 2**k)
trong khi không is_prime(p) hoặc không is_prime((p-1)//2):
p = ngẫu nhiên.randint(2**(k - 1), 2**k)
g = random_Z_N_star(p)
trong khi (MOD_EXP(g, (p-1)//2, p) == 1) hoặc (MOD_EXP(g, 2, p) == 1):
g = random_Z_N_star(p)
h = ngẫu nhiên_Z_N_star(p)
trong khi (h == g) hoặc (MOD_EXP(h, (p-1)//2, p) == 1) hoặc (MOD_EXP(h, 2, p) == 1):
h = ngẫu nhiên_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("Lợi thế của đối thủ A1 của bạn là xấp xỉ." + str(sim_hide.compute_advantage()))
print("Lợi thế của đối thủ A2 của bạn là xấp xỉ." + str(sim_bind.compute_advantage()))
Hoàn toàn bị mất, làm thế nào để tôi bắt đầu?