Score:0

ปลอมความมุ่งมั่น Pedersen

ธง in

วันนี้ฉันพบก เว็บไซต์ สำหรับแผนความมุ่งมั่นของ 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))
Daniel S avatar
ru flag
ปัญหาคือนิพจน์ `number.inverse(s,q)` และ `%q` คุณต้องคำนวณค่าผกผันของ $s$ โมดูโลกับลำดับของกลุ่มการคูณของ $q$ ไม่ใช่โมดูโล $q$ (เช่นเดียวกัน การลดลงสุดท้ายไม่ควรเป็นโมดูโล $q$) ถ้า $q$ เป็นจำนวนเฉพาะ ลำดับคือ $q-1$ แต่อย่างที่คุณทราบอย่างถูกต้อง รหัสนี้ไม่ได้ตรวจสอบว่า $q$ เป็นจำนวนเฉพาะหรือไม่ หากต้องการแก้ไข ให้ตรวจสอบว่า $q$ เป็นจำนวนเฉพาะ จากนั้นเปลี่ยนเป็น `((m1 - m2 + s * r1) * number.inverse(s, q-1))%(q-1)`
in flag
ขอบคุณ @DanielS

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา