มีตัวแปรที่มีประสิทธิภาพของ RSA โดยใช้ CRT
ตามวิธีที่เราใช้คำศัพท์โดยทั่วไป มันไม่ใช่ 'ตัวแปร' แต่เป็นการใช้งานทางเลือกแทน นั่นคือ การเปลี่ยนแปลงที่ทำกับอัลกอริทึม RSA เท่านั้นที่ทำกับการดำเนินการส่วนตัว (และรูปแบบของคีย์ส่วนตัว) ใครก็ตามที่ดำเนินการเฉพาะสาธารณะไม่จำเป็นต้องมีความรู้ว่าการใช้งานส่วนตัว (การสร้างลายเซ็นหรือถอดรหัสคีย์สาธารณะ) กำลังทำอะไรอยู่
ฉันจะใช้อัลกอริทึม CRT ได้ที่ไหน (ตามที่เขียนไว้ที่นั่น)
เมื่อใดก็ตามที่คุณต้องการประสิทธิภาพที่เพิ่มขึ้น (4 เท่า) และไม่ต้องกังวลกับความซับซ้อนที่เพิ่มขึ้นเล็กน้อย ส่วนใหญ่แล้วนี่เป็นการแลกเปลี่ยนที่คุ้มค่า
ฉันหมายถึงการตั้งค่า RSA กำหนดฉัน p,q,d,c อยู่แล้ว ดังนั้นฉันจึงไม่มีระบบที่สอดคล้องกัน
ที่จริงแล้ว พารามิเตอร์เพิ่มเติมทั้งหมด $d_p, d_q, qinv$ คำนวณได้อย่างง่ายดายในช่วงเวลาการสร้างคีย์ และนั่นคือสิ่งที่เรามักจะทำ
สมมติ $\log d = \log n=B$ และ $\log p = \log q = B/2$ และ $d,d_p,d_q$ มี 0 และ 1 จำนวนเท่าๆ กัน ฉันจะพูดอะไรเกี่ยวกับจำนวนการดำเนินการของขนาด $B$ ของตัวแปรนี้?
ที่จริงแล้ว จำนวน 0 และ 1 ส่วนใหญ่ไม่เกี่ยวข้องกัน เราสามารถทำการยกกำลังแบบโมดูลาร์ของ $B$ ค่าบิตด้วย $(1 + o(1)) \log_2 B$ การคูณแบบโมดูลาร์ (ขึ้นอยู่กับน้ำหนักการตอกของเลขยกกำลัง); อยู่ในช่วงการพิจารณาของ B อาจเป็นได้ $(1 + 1/6) \log_2 B$.
ด้วยการดำเนินการส่วนตัวของตำราเรียน RSA สิ่งนี้เกี่ยวข้องกับการยกกำลังแบบโมดูลาร์เดียวของ a $B$ ค่าบิตโดย a $B$ เลขชี้กำลังบิต; เป็นเรื่องเกี่ยวกับ $(1 + 1/6) \log_2 B$ ทวีคูณ ถ้าเราใช้ $O(n^2)$ อัลกอริธึมการคูณแบบแยกส่วน (ซึ่งเหมาะสมที่สุดสำหรับช่วงของ B ที่เราพูดถึง - มีรูทีนการคูณที่มีความซับซ้อนเชิงซีมโทติคต่ำกว่า แต่มีค่าคงที่ของสัดส่วนที่มากกว่า) เรากำลังพูดถึง $(1 + 1/6) (\log_2 B)^3$
ตอนนี้ ด้วย CRT มีการยกกำลังแบบโมดูลาร์ของสอง $B/2$ ทีละนิด $B/2$ เลขชี้กำลังบิต (รวมถึงการดำเนินการบางอย่างทั้งก่อนและหลัง - ทั้งสองอย่างค่อนข้างรวดเร็ว) ใช้ตรรกะเดียวกันก็ประมาณนี้ $2 (1 + 1/6) (\log_2 B/2)^3 = 1/4 (1 + 1/6) (\log_2 B)$นั่นคือเร็วประมาณ 4 เท่า (ใช่ นี่คือการเพิกเฉยต่อปัจจัยเล็กๆ น้อยๆ) แม้ว่าเราจะคำนึงถึงปัจจัยเล็กๆ เหล่านั้น แต่ CRT ก็ยังคงอยู่ อย่างมาก เร็วขึ้น