Score:1

คำถามสองสามข้อเกี่ยวกับฟังก์ชันเส้นโค้งวงรี

ธง tv

ฉันได้เรียนรู้เกี่ยวกับเส้นโค้งวงรีและวิธีทำงาน และการใช้งานในการเข้ารหัส และฉันกำลังพยายามค้นหาวิธีใช้งานโดยใช้ Go

  1. พารามิเตอร์ 'a' จากสมการ ECC ของฉันอยู่ที่ไหน y^2 = x^3 + a*x + b ในโครงสร้าง CurveParams นี้ https://golang.org/pkg/crypto/elliptic/#CurveParams เพื่อยืนยันว่าฉันเข้าใจดีแล้ว โปรดแก้ไขฉันหากฉันผิด:
  • พารามิเตอร์ 'P' แสดงถึงลำดับของฟิลด์จำกัด
  • 'N' คือจำนวนเฉพาะขั้นต่ำที่ทำให้ผลลัพธ์ของ N*G เป็นจุดอินฟินิตี้
  • 'B' คือค่าคงที่ 'b' ในสมการ ECC ของฉัน
  • 'Gx', 'Gy' แทนจุดฐาน (เช่น ใช้สำหรับคำนวณคีย์สาธารณะโดยใช้คีย์ส่วนตัวที่คุณเลือกและคูณด้วย G หรือในตัวอย่างด้านบนซึ่งใช้ N*G เพื่อคำนวณจุดอินฟินิตี้)
  • 'BitSize' นี่คือที่ที่ฉันไม่แน่ใจว่าสิ่งนี้หมายถึงอะไรฉันเข้าใจว่าในเส้นโค้ง P256 (secp256k1 BTC) นี่เท่ากับ 256 ดังนั้นจึงแสดงถึงความยาวของคีย์ส่วนตัว สิ่งที่ฉันไม่เข้าใจคือตัวเลขนี้ปรากฏจากที่ใดในทางคณิตศาสตร์ หรือจริงๆแล้วมันเป็นเพียงความยาวไบนารีของ 'P' ?
  • คำถามที่ใหญ่ที่สุดที่นี่คือพารามิเตอร์ 'a' จากสมการเส้นโค้งวงรีอยู่ที่ไหน จะกำหนดเส้นโค้งวงรีได้อย่างไรหากฉันไม่ตัดสินใจพารามิเตอร์นี้
  1. จะเกิดอะไรขึ้นถ้าคุณใช้ฟังก์ชัน Double() โดยใช้จุดที่ไม่ได้อยู่บนเส้นโค้ง หรือใช้จุดอนันต์ ผมพยายามค้นหาจุดที่ไม่พบบนเส้นโค้งเพื่อเรียกใช้ฟังก์ชันกับมัน แต่ไม่พบ (สำหรับเส้นโค้ง P256 ผมค้นหาใน google) https://golang.org/pkg/crypto/elliptic/#CurveParams.Double

  2. จะเกิดอะไรขึ้นถ้าคุณใช้ฟังก์ชัน Add() โดยใช้จุดที่ไม่ได้อยู่บนเส้นโค้ง หรือใช้จุดอนันต์ + บนจุดโค้ง หรือจุดอนันต์ + ไม่อยู่บนเส้นโค้ง https://golang.org/pkg/crypto/elliptic/#CurveParams.Add

  3. เหตุใดคีย์ส่วนตัวจึงส่งคืนเป็นประเภทไบต์ ข้อตกลงกับประเภทไบต์คืออะไร? เห็นใช้กันหลายที่ ทำไมเราไม่ใช้ประเภท int ขนาดใหญ่? ฉันเห็นว่ามีการใช้ GenerateKey(), Marshal(), MarshalCompressed(), UnmarshalCompressed(), ScalarBaseMult(), ScalarMult()

สำหรับคำถามทั้งหมดข้างต้น ฉันสนใจจากมุมมองทางคณิตศาสตร์และการเขียนโปรแกรมด้วย แต่โดยเฉพาะอย่างยิ่งการเขียนโปรแกรม หากคุณไม่มีคำตอบสำหรับทุกข้อ โปรดระบุคำตอบสำหรับคำถามที่คุณมีคำตอบ

แก้ไข:

  • คำถามที่ 1 ตอบบางส่วน BitSize ยังคงต้องมีการอธิบาย
Ievgeni avatar
cn flag
เท่าที่ฉันเข้าใจ [] ไบต์สามารถแสดงจำนวนเต็มขนาดตามอำเภอใจ ตัวเลือกที่นี่ดูเหมือนจะไม่จำกัดขนาดของจำนวนเต็มใน ScalarMult เพราะมันกำหนดไว้อย่างดีสำหรับจำนวนเต็มบวกใดๆ และในทางทฤษฏีแล้ว สำหรับเส้นโค้งเฉพาะบางเส้น ลำดับของ goup อาจมากกว่าลำดับของช่องฐาน จึงเป็นไปได้ว่า big_int จะไม่ใหญ่พอที่จะแสดงคีย์ส่วนตัว
thebalkandude avatar
tv flag
@levegni ตกลงมันค่อนข้างสมเหตุสมผล
President James K. Polk avatar
sh flag
ไม่ ประเภท big.Int ยังสามารถแสดงจำนวนเต็มที่มีขนาดตามอำเภอใจ เหตุผลในการใช้ไบต์เพื่อแสดงค่านั้นชัดเจนในเอกสารสำหรับ Marshall เป็นต้น มีรูปแบบมาตรฐานสำหรับการแลกเปลี่ยนที่กำหนดในรูปของไบต์ เนื่องจากไบต์ (อันที่จริง 'ออคเต็ต' นั้นแม่นยำกว่า) เป็นหน่วยมาตรฐานของ การจัดเก็บและการส่งผ่านเครือข่าย เหตุใด ScalarMult และที่คล้ายกันจึงใช้แบบฟอร์ม [] ไบต์ คุณต้องถามโปรแกรมเมอร์ แต่พวกเขาน่าจะคิดว่าสะดวกกว่า ประเภท big.Int มีวิธีการแปลงเป็นและจาก [] ไบต์ ดังนั้นในทางปฏิบัติจึงไม่ใช่ปัญหา
kelalaka avatar
in flag
ดูเหมือนคุณจะกังวลเกี่ยวกับ [การโจมตีจุดที่ไม่ถูกต้อง](https://crypto.stackexchange.com/q/87709/18298) การตรวจสอบเป็นสิ่งจำเป็น คีย์ส่วนตัวเป็นจำนวนเต็มขนาดใหญ่ที่เก็บเป็นวัตถุไบต์ไม่ต้องกังวล ห้องสมุดจัดการให้คุณและ [การแปลงเป็นเรื่องง่าย](https://stackoverflow.com/questions/24757814/golang-convert-byte-array-to-big-int)
Score:1
ธง cn

เพราะคุณรู้จุดหนึ่งของเส้นโค้ง (จุดฐาน) คุณสามารถคำนวณ $a$ :

$$a = \frac{(Gy)^2 -(Gx)^3 -b}{Gx} \mod p$$

ขอให้สังเกตว่าการคำนวณนี้ต้องการ $Gx \neq 0 \mod p$.

เกี่ยวกับจุดอินฟินิตี้ : จุดอินฟินิตี้ควรเป็นองค์ประกอบที่เป็นกลาง จากนั้นตามนิยามขององค์ประกอบที่เป็นกลาง : $(x,y)+\mathcal{O}=\mathcal{O}+(x,y) = (x,y)$ก็หมายความตามนั้น $2\mathcal{O}=\mathcal{O}$

ดังนั้น ดับเบิ้ล($\mathcal{O}$) จะคืนจุดเดิมให้คุณ $\mathcal{O}$. และด้วยเหตุผลเดียวกันนี้แอด$(\mathcal{O}, \cdot)$, เพิ่ม$(\cdot, \mathcal{O})$ เป็นทั้งฟังก์ชันเอกลักษณ์สำหรับเซตของจุดของเส้นโค้ง

คุณไม่ควรใช้ฟังก์ชันกับจุดที่ไม่ได้อยู่ในเส้นโค้ง ดังนั้นฉันจึงสันนิษฐานว่าควรส่งคืนข้อผิดพลาด หากคุณทำเช่นนั้น (มิฉะนั้นก็ควรทำ)

thebalkandude avatar
tv flag
ตกลงดังนั้นนี่จึงตอบคำถาม 3 ข้อแรกของฉันบางส่วน
poncho avatar
my flag
"คุณไม่ควรใช้ฟังก์ชันกับจุดที่ไม่ได้อยู่ในเส้นโค้ง ดังนั้นฉันจึงถือว่ามันควรจะส่งกลับข้อผิดพลาด" - รูทีน ECC โดยทั่วไปจะไม่ทำ ใช่ พวกเขา *สามารถ* ตรวจสอบได้; อย่างไรก็ตาม เวลาที่ใช้จะเป็นเศษส่วนที่มีนัยสำคัญของเวลาบวกของจุด ดังนั้นโดยทั่วไปแล้ว พวกเขาจะไม่กังวลกับผลลัพธ์ขั้นกลาง พวกเขาควรตรวจสอบเมื่อคุณเริ่มนำเข้าค่า (และเมื่อพวกเขารู้ว่าค่าเริ่มต้นอยู่บนเส้นโค้ง ค่ากลางทั้งหมดก็จะเป็นเช่นนั้นด้วย) จากประสบการณ์ของฉัน แม้ว่าจะไม่เป็นสากลก็ตาม

โพสต์คำตอบ

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