Score:0

การสุ่มตัวอย่างและการสุ่มที่เพิ่มขึ้นในโปรโตคอลการเข้ารหัส

ธง do

เพื่อเป็นตัวอย่างสำหรับคำถามของฉัน ฉันโพสต์อัลกอริทึมการลงนาม ECDSA สำหรับการอ้างอิง (จาก วิกิพีเดีย) เพื่อเซ็นข้อความ $m$:

  1. คำนวณ $e = H ( ม )$.
  2. เลือกจำนวนเต็มแบบสุ่ม $k \in [ 1 , n â 1 ] $
  3. คำนวณจุดโค้ง $( x_1 , y_1 ) = k à G $
  4. คำนวณ $r = x_1$ ม็อด $n$. ถ้า $r = 0$ ให้กลับไปที่ขั้นตอนที่ 2
  5. คำนวณ $s = k ^{â 1} ( z + r d_A )$ ม็อด $n$. ถ้า $s = 0$ให้กลับไปที่ขั้นตอนที่ 2
  6. ลายเซ็นเป็นคู่ $( ร , ส )$

คำถามของฉันมีดังนี้ เมื่อขั้นตอนที่ 4 หรือ 5 ล้มเหลว เช่น $r=0$ หรือ $s=0$ อัลกอริทึมจำเป็นต้องวนกลับและสุ่มตัวอย่างใหม่ $k$ (แม้ว่าความน่าจะเป็นจะต่ำตามคำสั่ง $n$ ของกลุ่ม $G$ มีขนาดใหญ่มาก) แต่ในกรณีนั้น ทำไมอัลกอริทึมต้องทำการสุ่มใหม่ มันจะไม่มีประสิทธิภาพมากขึ้นที่จะเพิ่มขึ้น $k$ แทน? ฉันยกตัวอย่างคำถามนี้สำหรับ ECDSA แต่สิ่งนี้ใช้ได้กับโปรโตคอลการเข้ารหัสอื่นๆ เช่นกัน ฉันเห็นการสุ่มตัวอย่างซ้ำทุกที่แทนที่จะเพิ่มขึ้นและจากมุมมองด้านความปลอดภัย การสุ่มที่เพิ่มขึ้นไม่ควรสร้างความแตกต่าง..

Score:3
ธง my

และจากมุมมองด้านความปลอดภัย การสุ่มที่เพิ่มขึ้นไม่ควรสร้างความแตกต่าง..

มีเหตุผลสองประการในการ 'ย้อนกลับ' แทนที่จะใช้ตรรกะพิเศษบางอย่าง

เหตุผลประการแรกคือการลดจำนวนรหัสวัตถุประสงค์พิเศษที่ 'ทดสอบยาก' วิธีใด ๆ ของการเพิ่มขึ้น $k$' จะเกี่ยวข้องกับโค้ดที่ไม่ค่อยได้รันมากนัก (ซึ่งจะเป็นการยากที่จะสร้างการทดสอบหน่วย) โค้ดที่สัมผัสยากดังกล่าวคือตำแหน่งที่อุดมสมบูรณ์สำหรับข้อผิดพลาดในการเข้ารหัสที่ตรวจไม่พบ ดังนั้นควรหลีกเลี่ยงหากเป็นไปได้ ในทางตรงกันข้าม การย้อนกลับและเรียกใช้ขั้นตอนเดิมซ้ำโดยพื้นฐานแล้วจะเกิดข้อผิดพลาดน้อยกว่ามาก

อีกเหตุผลหนึ่งคือการนำข้อมูลที่ถือว่า 'ยอมรับไม่ได้' มาใช้ซ้ำอาจรั่วไหลได้

ตัวอย่างเช่น สมมติว่าฝ่ายตรงข้ามสามารถตรวจจับได้เมื่อการเพิ่มขึ้นดังกล่าวเกิดขึ้น (เช่น โดยการติดตามอย่างใกล้ชิดเวลาที่ใช้ในการสร้างลายเซ็นดังกล่าว) และในความเป็นจริงเกิดขึ้นเนื่องจาก $s=0$. ถ้าเป็นเช่นนั้น เราเพิ่งรั่วไหลของรหัสส่วนตัว

นี่คือสิ่งที่เกิดขึ้น: ในการวนซ้ำครั้งแรก เราคำนวณ $s = k^{-1}( z + rd_A )$ แล้วพบว่ามันเป็น 0 เราก็เลย $r' = ((k+1)G)_x$ แทนและส่งออกที่ (และไปคำนวณ $s'$ซึ่งการโจมตีนี้ไม่ได้ใช้)

สิ่งที่ผู้โจมตีสามารถทำได้คือสร้างจุดใหม่ $(k+1)G$ จากพิกัด x ที่เราเพิ่งให้เขาไป (อันที่จริง มันเป็นหนึ่งในสองจุด นั่นหมายความว่าเขาลองทั้งคู่); นั่นทำให้เขาสามารถคำนวณใหม่ได้ $kG$และทำให้ต้นฉบับ $r$

ตอนนี้เขารู้แล้ว $k^{-1}(z + rd_A) = 0$, ตอนนี้ $k^{-1} \ne 0$ (ผกผันไม่เป็นศูนย์) เป็นต้น $d_A = -r^{-1}z$; เขารู้ว่า $z$ (จากข้อความที่ลงชื่อ) และ $r$นั่นทำให้เขามีรหัสส่วนตัว $d_A$.

ทีนี้ถ้าเราเลือกการสุ่มอย่างสมบูรณ์ $k$ แต่ละครั้งเราไม่ต้องกังวลกับการโจมตีที่ไม่ชัดเจนเช่นนี้

ตอนนี้ในทางปฏิบัตินี้ $s=0$ โดยพื้นฐานแล้วเงื่อนไขไม่เคยเกิดขึ้น (เกิดขึ้นด้วยความน่าจะเป็นแบบเดียวกับที่การสุ่มเดาที่คีย์ส่วนตัวนั้นถูกต้อง) ดังนั้นจึงดูเหมือนว่าเราไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้ ฉันยังคงเชื่อถือวิธีที่เกิดข้อผิดพลาดน้อยกว่าและปลอดภัยกว่า แม้ว่าจะใช้เวลานานกว่านั้น (และหากแทบไม่เกิดขึ้นเลย เวลาที่ใช้ก็มักจะไม่เกี่ยวข้องกัน)

โพสต์คำตอบ

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