Score:2

การเพิ่มจุด ECC บนพิกัด Jacob -- ไม่สับเปลี่ยน?

ธง us

ฉันมีสคริปต์หลามที่ทำการเพิ่มจุด ECC (วางโค้ดด้านล่าง) มันเพียงแค่ดำเนินการ P =Q1+Q2 ในการประสานงานของ Jacob อย่างไรก็ตาม เมื่อทำการทดสอบการถดถอย ฉันพบว่าถ้าฉันแลกเปลี่ยนตำแหน่ง P1 และ P2 ฉันจะได้ผลลัพธ์ที่แตกต่างกัน ซึ่งหนึ่งในนั้นถูกต้อง ด้านล่างนี้คือตัวอย่างที่ใช้จุด secp256k1 G เป็นจุดเดียว และใช้ 2*G เป็นจุดที่สองเพื่อเรียกใช้การทดสอบ

คำถามของฉัน (อัปเดตความคิดเห็นหลังจากได้รับการตอบกลับจาก @fgrieu) 1). การเพิ่มจุด ECC บนเส้นโค้ง - จะเป็นการสับเปลี่ยน (ควรเป็น) หรือไม่

2). ฉันสังเกตเห็นว่าสำหรับผลลัพธ์ พิกัด x เหมือนกันในขณะที่ y/z ต่างกัน -- (พวกมันแทนค่าเดียวกันบนพิกัดใกล้เคียงกัน)

3). ตามคำแนะนำฉันอัปเดตสคริปต์ทำให้เสร็จ

def Point_Add (ตัวเอง, Q1, Q2):
    ถ้า (Q1.x==self.p): 
        ผลตอบแทน Q2
    ถ้า (Q2.x==self.p):
        ผลตอบแทน Q1
    Q1z2 = (Q1.z*Q1.z) % ตัวเอง.p
    Q2z2 = (Q2.z*Q2.z) % ตัวเอง.p

    U1 = (Q1.x*Q2z2) % ตัวเอง.p
    U2 = (Q2.x*Q1z2) % ตัวเอง.p

    S1 = (Q1.y*Q2z2*Q2.z) % ตัวเอง.p
    S2 = (Q2.y*Q1z2*Q1.z) % ตัวเอง.p
    ถ้า (U1 == U2): 
        ถ้า (S1!=S2): # คู่ตรงข้าม เช่น Q1 = -Q2
            กลับ self.Unit
        อื่น: # Q1 = Q2
            กลับ self.Point_Double(Q1)

    H = (U2-U1) % ตัวเอง.p   
    R = (S2-S1) % ตนเอง.p
    H2 = (H*H) % ตัวเอง.p
    H3 = (H2*H) % ตัวเอง.p

    x3 = (R*R-H3-2*U1*H2 ) % ตัวเอง.p
    y3 = (R*(U1*H2-x3)-S1*H3 ) % ตัวเอง.p
    z3 = (H*Q1.z*Q2.z) % ตัวเอง.p

ส่งคืน JBPoint (ตัวเอง, x3, y3, z3)

ผลการทดสอบ
ดีบัก 1: ทดสอบ P=Q1+Q2:
Point.X(จาค็อบ): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Point.Y(เจคอบ): 0x435afe76017b8d55d04ff8a98dd60b2ba7eb6f87f6b28182ca4493d7165dd127
Point.Z(เจคอบ): 0x9242fa9c0b9f23a3bfea6a0eb6dbcfcbc4853fe9a25ee948105dc66a2a9b5baa
จุด X (เปรียบเทียบ): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
จุด Y (เปรียบเทียบ): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
จุด X (เปรียบเทียบ): 112711660439710606056748659173929673102114977341539408544630613555209775888121
จุด Y (เปรียบเทียบ): 25583027980570883691656905877401976406448868254816295069919888960541586679410
ดีบัก 2: ทดสอบ P=Q2+Q1:
Point.X(จาค็อบ): 0xca90ef9b06d7eb51d650e9145e3083cbd8df8759168862036f97a358f089848
Point.Y(เจคอบ): 0xbca50189fe8472aa2fb007567229f4d458149078094d7e7d35bb6c27e9a22b08
Point.Z(จาค็อบ): 0x6dbd0563f460dc5c401595f1492430343b7ac0165da116b7efa23994d564a085
จุด X (เปรียบเทียบ): 0xf9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9
จุด Y (เปรียบเทียบ): 0x388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672
จุด X (เปรียบเทียบ): 112711660439710606056748659173929673102114977341539408544630613555209775888121
จุด Y (เปรียบเทียบ): 25583027980570883691656905877401976406448868254816295069919888960541586679410
Score:4
ธง ng
  1. การเพิ่มจุด ECC เป็นการแลกเปลี่ยน

  2. ปัญหาที่พบคือในระบบพิกัดจาโคเบียน จุดอื่นที่ไม่ใช่จุดกลางมีพิกัดสามส่วนที่ถูกต้องเท่ากันหลายจุด $(x,y,z)$ล้วนสอดคล้องกัน $(z^{-2}\,x,z^{-3}\,y)$ ในระบบพิกัดคาร์ทีเซียน สามารถทดสอบความเท่าเทียมกันได้เป็น ${z_2}^2\,x_1-{z_1}^2\,x_2\bmod p=0$ และ ${z_2}^3\,y_1-{z_1}^3\,y_2\bmod p=0$ (หากมีทางลัดนอกเหนือจากการใช้ซ้ำ $z^2$ เพื่อคำนวณ $z^3$ สมมติว่าจุดอยู่บนเส้นโค้ง ฉันต้องการเรียนรู้)

  3. เดอะ รหัสที่แสดงในตอนแรก ไม่ได้จัดการกรณีที่ ไตรมาสที่ 1 และ ไตรมาสที่ 2 เป็นตัวแทนของจุดเดียวกัน (นั่นคือจุดสองเท่า) นอกจากนี้ ยังไม่มีการระบุวิธีการแสดงความเป็นกลางในอินพุตและเอาต์พุต ได้รับการแก้ไขแล้ว


อัปเดต, ขยายเป็น 3: มีกรณีพิเศษหลายอย่างที่ต้องชี้เพิ่มเติม $Q_1+Q_2$ที่ต้องการการดูแลเป็นพิเศษ:

  • เมื่อไร $Q_1$ เป็นกลาง ผลคือ $Q_2$;
  • เมื่อไร $Q_2$ เป็นกลาง ผลคือ $Q_1$;
  • เมื่อไร $Q_1=Q_2$ (ภายในคำจำกัดความในข้อ 2) นั่นคือจุดสองเท่า
  • เมื่อไร $Q_1=-Q_2$ผลลัพธ์คือค่ากลาง

มีหลายวิธีในการจัดการกับสิ่งนี้ หากถูกขอให้แก้ไข รหัส Python แสดงในตอนแรกก่อนอื่นฉันจะเพิ่มข้อจำกัดความรับผิดชอบที่เด่นชัดว่ารหัสไม่ได้พยายามลดการโจมตีตามเวลา (ซึ่งแทบจะเป็นไปไม่ได้เลยที่จะทำได้อย่างสมบูรณ์ใน Python) ดังนั้นจึงไม่ควรใช้เมื่อเป็นปัญหา (มักจะรวมถึงการคำนวณลายเซ็นด้วย) ถ้าอย่างนั้นฉันอาจจะ:

  • กำหนดสิ่งนั้นด้วย $z=0$ เป็นกลางและใช้สิ่งนี้เพื่อจัดการกับสองกรณีแรกด้วยวิธีที่ชัดเจน และกรณีที่สี่โดยไม่ต้องใช้รหัสเพิ่มเติม
  • ตรวจจับสิ่งนั้น $H=0$ และ $R=0$ซึ่งบอกว่าเรากำลังทำ point double และต้องใช้สูตรอื่น

รหัสที่แสดงตอนนี้ใช้วิธีอื่น (ฉันคิดว่าถูกต้อง) โดยที่ $(หน้า,0,1)$ คือความเป็นกลาง ใช้งานได้เช่นกันโดยมีประสิทธิภาพ (อาจวัดแทบไม่ได้) และข้อเสียเปรียบขนาดรหัส:

  • รหัสที่ชัดเจนเป็นสิ่งจำเป็นสำหรับ $Q_1=-Q_2$ กรณีไม่เป็นกลาง เมื่อไม่ใช่สำหรับความเป็นกลางที่กำหนดเป็น $(หน้า,0,1)$. ในการใช้งานจริงอย่างถูกกฎหมายในการเข้ารหัส กรณีพิเศษนั้นหายากมาก การลบออกจะช่วยปรับปรุงประสิทธิภาพ
  • การทดสอบเริ่มต้นสองครั้งสำหรับค่ากลางนั้นใหญ่กว่าและช้ากว่าเล็กน้อย

อีกครั้ง ควรเพิ่มความคิดเห็นว่าโค้ดไม่ได้พยายามหลีกเลี่ยงการขึ้นต่อกันของเวลาที่ขึ้นกับข้อมูล ซึ่งอาจสร้างช่องทางด้านข้างได้

LeonMSH avatar
us flag
ขอบคุณมากสำหรับการตอบกลับอย่างรวดเร็ว... Q2) หมายความว่าผลลัพธ์ทั้งสองที่ฉันได้รับนั้นถูกต้อง (แสดงจุดเดียวกันบนพิกัดคาร์ทีเซียน) หรือไม่ มีข้อจำกัดเพิ่มเติมอีกไหมที่ฉันสามารถตั้งค่า เพื่อให้ฉันได้รับพิกัดจาค็อบที่ไม่ซ้ำใคร ฉันสามารถเปลี่ยนกลับไปตรวจสอบพิกัดคาร์ทีเซียนสำหรับสิ่งนั้นได้ แต่เนื่องจากฉันมีการทดสอบเกณฑ์มาตรฐานที่ต้องทำในภายหลังเพื่อให้แน่ใจว่าพิกัดจาค็อบทำงานได้อย่างสมบูรณ์แบบ หากไม่มีค่าเฉพาะจะไม่สะดวกมาก ) 3) ใช่ คุณพบ ฉันยังไม่ได้ตรวจสอบกรณีพิเศษที่ควรเพิ่ม;
LeonMSH avatar
us flag
ใช่ ฉันทำการตรวจสอบพิกัดที่ใกล้เคียงกัน จุดผลลัพธ์จะเหมือนกันเมื่อเทียบที่จริง คำถามที่เหลือของฉันคือ: มีวิธีใด (หรือยุ่งยาก) ที่ฉันจะได้รับพิกัด Jacob เดียวกันเสมอ (ฉันไม่สนใจความครอบคลุม แต่สนใจเรื่องความถูกต้อง
fgrieu avatar
ng flag
@LeonMSH: วิธีเดียวที่ฉันเห็นว่า "ได้พิกัด Jacob[ian] เดิมเสมอ" คือการทำให้ $z$ เท่ากันเช่น $z=1$ นั่นคือการเปลี่ยนแปลง $(x,y,z)$ ของผลลัพธ์เป็น $(z^{-2}\,x,z^{-3}\,y,1)$ แต่นั่นเป็นการลบล้างเหตุผลของการใช้พิกัดจาโคเบียนในตอนแรก ซึ่งก็คือเพื่อหลีกเลี่ยงการผกผันของโมดูลาร์
111 avatar
us flag
111
บางทีถ้าคุณใช้เฉพาะพิกัดที่ใกล้เคียงกัน มีพิกัดใกล้เคียงกัน ให้พูดว่า $(a,b)$ เพื่อรับพิกัดเชิงโครงของจุดนี้ เพียงส่งไปที่ $[a:b:1].$ จำเป็นต้องมีการดูแลเป็นพิเศษสำหรับจุดที่ไม่มีที่สิ้นสุด หากคุณเพิ่มจุด $(a_1,b_1)$ และ $(a_2,b_2)$ คุณต้องตรวจสอบว่า $b_1=b_2.$ การเพิ่มจุดเหล่านี้คือจุดที่ไม่มีที่สิ้นสุด $[0:1:0]$ (ใช้โมเดลไวเออร์สตราส) หวังว่าจะช่วยได้
LeonMSH avatar
us flag
@111 สำหรับจุดดึงดูด P1(a1,b1) และ P2(a2,b2) ถ้า b1=b2, P1+P2 ควรเป็นจุดสองเท่า? ฉันคิดว่าคุณหมายถึง b1 = -b2 กรณี?
LeonMSH avatar
us flag
@fgrieu ในแง่ของจุดอินฟินิตี้ O พิกัดจาโคเบียน - ฉันเห็นการเป็นตัวแทนที่แตกต่างกันเช่น O= (p, 0, 1), (0, 1, 0), (1 , 1 , 0) แล้วอะไรคือสิ่งที่ถูกต้อง?
111 avatar
us flag
111
@LeonMSH ถูกต้อง b1=-b2.
LeonMSH avatar
us flag
@fgrieu ฉันอัปเดตสคริปต์ BTW จุดหน่วยที่ฉันใช้สำหรับรหัสนี้คือ O(p,0,1) แต่ไม่ชี้ด้วย z=0 .. มันใช้งานได้ นั่นคือเหตุผลที่ฉันถามคำถามเกี่ยวกับจุด O สำหรับจุด jacob ..

โพสต์คำตอบ

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