และจากมุมมองด้านความปลอดภัย การสุ่มที่เพิ่มขึ้นไม่ควรสร้างความแตกต่าง..
มีเหตุผลสองประการในการ 'ย้อนกลับ' แทนที่จะใช้ตรรกะพิเศษบางอย่าง
เหตุผลประการแรกคือการลดจำนวนรหัสวัตถุประสงค์พิเศษที่ 'ทดสอบยาก' วิธีใด ๆ ของการเพิ่มขึ้น $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$ โดยพื้นฐานแล้วเงื่อนไขไม่เคยเกิดขึ้น (เกิดขึ้นด้วยความน่าจะเป็นแบบเดียวกับที่การสุ่มเดาที่คีย์ส่วนตัวนั้นถูกต้อง) ดังนั้นจึงดูเหมือนว่าเราไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้ ฉันยังคงเชื่อถือวิธีที่เกิดข้อผิดพลาดน้อยกว่าและปลอดภัยกว่า แม้ว่าจะใช้เวลานานกว่านั้น (และหากแทบไม่เกิดขึ้นเลย เวลาที่ใช้ก็มักจะไม่เกี่ยวข้องกัน)