วันนี้ฉันพบก เว็บไซต์ สำหรับแผนความมุ่งมั่นของ Pedersen; อย่างไรก็ตามเครื่องกำเนิดไฟฟ้า ช
และ ชม.
ไม่เป็นอิสระและดังนั้นผู้พิสูจน์สามารถเปิดข้อผูกมัดได้ ค
ได้หลายทาง ฉันคำนวณความมุ่งมั่น ค
สำหรับข้อความ ม
และความบังเอิญ ร
(สมมุติว่ารู้ ส
):
c = g^m * h^r
= g^m * (g^s)^r
= g^m * (g^(ส * r))
= ก^(ม + ส * ร)
จงกล่าวเถิด ฉันได้ผูกพันกับข้อความนั้นแล้ว ม
, ความบังเอิญ ร
และความมุ่งมั่นคือ ค
(ค = g ^ (m + s * r)
. ตอนนี้ฉันต้องการปลอมนั่นคือเปิดสำหรับข้อความอื่น ม'
, ไม่เท่ากับ ม
ดังนั้นฉันจึงต้องคำนวณการสุ่มใหม่ r'
: r' = (m - m' + s * r) * s^(-1)
. ฉันเอาโค้ดไพธอนเดิมไปโพสต์บนเว็บไซต์และทำการแก้ไขเล็กน้อยแล้วส่งคืน ส
. นอกจากนี้ ฉันเขียนฟังก์ชันอื่น ข้อความปลอม เพื่อคำนวณข้อความโดยพลการสำหรับการเปิดด้วยข้อผูกมัดเดียวกัน แต่เมื่อฉันเรียกใช้โค้ดที่แก้ไข บรรทัดสุดท้าย
r2 = พิมพ์ (vv.open (พารามิเตอร์, c, m2, r2))
กำลังส่งคืนเท็จ คำถามของฉันคือ: ความคิดของฉันคืออะไร และการนำ Python ไปใช้งานคืออะไร (ฉันใช้ pycryptodome 3.10.1)
จากการนำเข้า Crypto แบบสุ่ม
จากหมายเลขนำเข้า Crypto.Util
นำเข้าระบบ
def สร้าง (พารามิเตอร์):
p = พารามิเตอร์[0]
q = พารามิเตอร์ [1]
g = พารามิเตอร์ [2]
ชั่วโมง = พารามิเตอร์ [3]
s = พารามิเตอร์ [4]
กลับ p,q,g,h,s
ตัวตรวจสอบคลาส:
การตั้งค่า def (ตัวเอง, ความปลอดภัย):
p = number.getPrime(2 * ความปลอดภัย, Random.new().read)
q = 2*p + 1 # อืม ไม่มีการทดสอบว่า q เป็นจำนวนเฉพาะหรือไม่
g = number.getRandomRange(1, q-1)
s = number.getRandomRange(1, q-1)
พิมพ์ ("ค่าลับ: \ t", s)
ชั่วโมง = ธาร (g,s,q)
พารามิเตอร์ = (p,q,g,h,s)
พิมพ์ ("p = ", p)
พิมพ์("q=",q)
พิมพ์ ("g =",g)
พิมพ์ ("h = ", ชั่วโมง)
พิมพ์ ("s =", s)
พารามิเตอร์ย้อนกลับ
def เปิด (ตัวเอง, พารามิเตอร์, c, m, r):
p,q,g,h,s = สร้าง (พารามิเตอร์)
ความละเอียด = (pow(g,m,q) * pow(h,r,q)) % q
กลับ (c == ความละเอียด)
ผู้พิสูจน์ระดับ:
def กระทำ (ตัวเอง, พารามิเตอร์, m):
p,q,g,h,s= สร้าง (พารามิเตอร์)
r = number.getRandomRange(1, q-1)
c = (pow(g,m,q) * pow(h,r,q)) % q
กลับ c, r
# ฉันจะเปิดเป็น m2 ข้อความแบบสุ่มโดยพลการ
def fake_message (ตัวเอง, พารามิเตอร์, c, m1, r1):
p,q,g,h,s = สร้าง (พารามิเตอร์)
#รับข้อความแบบสุ่ม
m2 = number.getRandomRange(1, q-1)
r2 = ((m1 - m2 + s * r1) * number.inverse(s, q))%q
กลับ (m2, r2)
ความปลอดภัย = 80
เมตร = 2
vv = ผู้ตรวจสอบ ()
pp = ผู้พิสูจน์ ()
param = vv.setup (ความปลอดภัย)
c, r = pp.commit(พารามิเตอร์, ม.)
พิมพ์ (vv.open (พารามิเตอร์, c, m, r))
m2, r2 = pp.fake_message(พารามิเตอร์, c, m, r)
พิมพ์ (vv.open (พารามิเตอร์, c, m2, r2))