ฉันมีปัญหานี้:
ฉันยังมีปัญหานี้ในเวอร์ชัน python ที่นี่:
นำเข้า json
นำเข้า sys, os, itertools
sys.path.append(os.path.abspath(os.path.join('..')))
จากการนำเข้า playcrypt.tools *
จากการนำเข้า playcrypt.new_tools *
จากการนำเข้า playcrypt.primitives *
จาก playcrypt.games.game_bind นำเข้า GameBIND
จาก playcrypt.simulator.bind_sim นำเข้า BINDSim
จาก playcrypt.games.game_hide นำเข้า GameHIDE
จาก playcrypt.simulator.hide_sim นำเข้า HIDESim
def เพิ่ม (a, b):
คืนค่า a+b
def MULT(a,b):
กลับ a*b
def INT_DIV(a,N):
กลับ (a//N, a%N)
def MOD (a, N):
ส่งคืน %N
def EXT_GCD(a,N):
ส่งคืน egcd(a,N)
def MOD_INV(a,N):
ความละเอียด = modinv(a,N)
ถ้า res == ไม่มี:
เพิ่ม ValueError ("ไม่มีผกผัน")
คืนความละเอียด
def MOD_EXP(a,n,N):
ส่งคืนประสบการณ์ (a, n, N)
"""
ให้ p เป็นจำนวนเฉพาะของความยาวบิต k >= 8 โดยที่ (p - 1)/2 เป็นจำนวนเฉพาะด้วย ให้ ก,
h เป็นเครื่องกำเนิดสองตัวที่แตกต่างกันของกลุ่ม G = Z_p^* ให้ CS= (P, C, V) เป็น
รูปแบบความมุ่งมั่นที่มีอัลกอริทึมที่เป็นส่วนประกอบดังต่อไปนี้ โดยที่ข้อความ
M อยู่ใน Z_{p-1}:
"""
def P():
ปี่ = (g, h)
กลับปี
def C(pi, M):
"""
:param pi: พารามิเตอร์สาธารณะ
:param M: ข้อความที่จะส่ง องค์ประกอบของ Z_{p-1}
:return: ส่งคืนค่าคอมมิชชันและคีย์ decommital
"""
(g, h) = ปี่
K = สุ่ม_Z_N(p-1)
A = MOD_EXP(g, K, p)
B = MOD_EXP(ชม., รอบ, หน้า)
C_1 = MOD(A*B, หน้า)
C_2 = MOD(M+K, หน้า-1)
กลับ ((C_1, C_2), K)
def V(pi, C, M, K):
"""
:param pi: พารามิเตอร์สาธารณะ
:param C: ความมุ่งมั่น
:param M: ข้อความที่จะตรวจสอบ
:param K: คีย์ทศนิยม
:return: ส่งคืน 1 หากการเปิดถูกต้องและ 0 มิฉะนั้น
"""
(g, h) = ปี่
(C_1, C_2) = ค
ถ้าไม่ใช่ 0 <= K < p-1 หรือไม่ 0 <= M < p-1:
กลับ 0
A = MOD_EXP(g, K, p)
B = MOD_EXP(ชม., รอบ, หน้า)
C_1_prime = MOD(A*B, หน้า)
C_2_prime = MOD(M+K, หน้า-1)
ถ้า (C_1 == C_1_prime) และ (C_2 == C_2_prime):
กลับ 1
อื่น:
กลับ 0
"""
1. ระบุ O(k^3)-time ฝ่ายตรงข้าม A1 ทำการสืบค้นหนึ่งรายการไปยัง LR oracle และ
ได้รับ Adv^{hide}_CS(A1) = 1
"""
def A1(lr, ปี่):
"""
นี่คือศัตรูที่เป็นปัญหา
ขอ ควรส่งคืน 0 หรือ 1
:param lr: oracle ที่จัดทำโดย game HIDE
:param pi: pi พารามิเตอร์สาธารณะ
"""
ผ่าน
"""
2. ระบุ O(k)-time ฝ่ายตรงข้าม A2 เพื่อให้ Adv^{bind}_CS(A2) = 1
(คำแนะนำ: ค่าของ g^{(p-1)/2} mod p คืออะไร และเพราะเหตุใด)
"""
def A2(ปี่):
"""
นี่คือศัตรูที่เป็นปัญหา
ขอ ควรส่งคืนทูเพิล (C, M_0, M_1, K_0, K_1)
:param pi: pi พารามิเตอร์สาธารณะ
"""
กลับ ((0, 0), 0, 0, 0, 0)
ถ้า __name__ == '__main__':
# ตัวอย่างพารามิเตอร์สุ่ม
k = 12
พิมพ์ ('สุ่มตัวอย่างพารามิเตอร์สุ่มของความยาวบิต k = %d' % k)
p = Random.randint(2**(k - 1), 2**k)
ในขณะที่ไม่ใช่ is_prime(p) หรือไม่ใช่ is_prime((p-1)//2):
p = Random.randint(2**(k - 1), 2**k)
g = สุ่ม_Z_N_star(หน้า)
ขณะที่ (MOD_EXP(g, (p-1)//2, p) == 1) หรือ (MOD_EXP(g, 2, p) == 1):
g = สุ่ม_Z_N_star(หน้า)
ชั่วโมง = Random_Z_N_star(หน้า)
ในขณะที่ (h == g) หรือ (MOD_EXP(h, (p-1)//2, p) == 1) หรือ (MOD_EXP(h, 2, p) == 1):
ชั่วโมง = Random_Z_N_star(หน้า)
พิมพ์ ('p = %d, g = %d, h = %d' % (p, g, h))
game_hide = ซ่อนเกม(P, C)
sim_hide = ซ่อนซิม (game_hide, A1)
game_bind = GameBIND(P, V)
sim_bind = BINDSim(game_bind, A2)
print("ข้อได้เปรียบของศัตรู A1 นั้นประมาณได้" + str(sim_hide.compute_advantage()))
พิมพ์("ข้อได้เปรียบของ A2 ของฝ่ายตรงข้ามคือประมาณ" + str(sim_bind.compute_advantage()))
หายเกลี้ยง เริ่มยังไงดี?