แม้ว่า RSA จะไม่ได้มีไว้สำหรับการเข้ารหัส แต่ก็สามารถใช้ RSA สำหรับการเข้ารหัสได้ หากใครใช้ TextBook RSA ก็จะไม่ปลอดภัยเนื่องจากการเข้ารหัสนั้นฟรี ดังนั้นผู้โจมตีจะสามารถตรวจสอบค่าได้ เราเรียกสิ่งนี้ว่าการเข้ารหัสของออราเคิล และไม่มีให้ใช้ในระบบคีย์สาธารณะ
ง่ายๆ ออราเคิลเข้ารหัส RSA เกม...
def Ind_CPA_RSA(ฝ่ายตรงข้าม, เป้าหมาย):
(e,n,d,...) = create_RSA_key() // ส่วนคีย์เจน
def RSA_encryption_oracle_PKCS#1_v1.5(ข้อความธรรมดา): //เข้ารหัส oracle
EM = PKCS#1_v1.5_padding(ข้อความธรรมดา)
ciphertext = EM^e ม็อด n
ส่งคืนข้อความรหัส
สำหรับแต่ละ m ใน possible_message_space: //queries
c = RSA_encryption_oracle_PKCS#1_v1.5(ม)
ถ้า c == เป้าหมาย
พิมพ์(เป้าหมาย)
คืนความสำเร็จ
กลับล้มเหลว
ดังนั้น ฝ่ายตรงข้ามจึงพยายามส่งข้อความที่เป็นไปได้ทั้งหมดตราบเท่าที่พวกเขาทำได้ เพื่อดูความเสมอภาคที่จะชนะ
ในตำรา RSA ถ้าเลขชี้กำลังสาธารณะ $e=3$ แล้ว การโจมตีรากลูกบาศก์ ใช้งานได้กับข้อความทั้งหมดเช่นนั้น $len(m) < \sqrt[3]{n}$.
สำหรับการโจมตีอื่นๆ บทความของ Dan Boneh เป็นจุดเริ่มต้นที่ดี
$$\textbf{อย่าใช้ Text Book RSA ตราบใดที่คุณรู้ว่าคุณทำอะไร!}$$
เพื่อความปลอดภัยเราต้องใช้การเข้ารหัส RSA พร้อมช่องว่างภายในที่เหมาะสม PKCS#1 v1.5 (RSAES-PKCS1-v1_5) หรือ สกอ (RSAES-OAEP) ช่องว่างภายใน ช่องว่างเหล่านี้เพิ่มการสุ่มเพื่อให้ได้การเข้ารหัสที่น่าจะเป็น
แต่ละรายการใช้การเข้ารหัสพิเศษเพื่อให้ได้สิ่งนี้ เช่น การเติม PKCS#1 v1.5;
EM = 0x00 || 0x02 || ปล.|| 0x00 || ม.
ม
เป็นข้อความ เดอะ ปล
ประกอบด้วยส่วนการสุ่ม
สร้างสตริงออคเต็ต PS ที่มีความยาว k - mLen - 3
ประกอบด้วยออคเต็ตที่ไม่ใช่ศูนย์ที่สร้างขึ้นแบบสุ่มหลอก
ความยาวของ PS จะเป็นแปดออคเต็ตเป็นอย่างน้อย
ตัวอย่างเช่น สำหรับ RSA 2048 บิต; $k = 256$, $mLen=4$ แล้ว ปล
ความยาวคือการสุ่ม 249 ไบต์สำหรับข้อความขนาดตัวอักษรหนึ่งข้อความ ดังนั้นผู้โจมตีจึงไม่สามารถทดสอบค่าด้วยออราเคิลเข้ารหัสได้ ส่วนที่เหลือกำลังโจมตี ปัญหา RSA.
ในทำนองเดียวกัน OAEP มีการสุ่มและ OAEP ได้รับการพิสูจน์แล้วว่ามีการรักษาความปลอดภัย IND-CCA1 เลือกใช้ OAEP เป็น PKCS#1 v1.5 เนื่องจากมีการโจมตีจำนวนมากเนื่องจากการใช้งานที่ไม่เหมาะสม
หากใครต้องการบทความทางวิชาการเกี่ยวกับเมตริกของการเข้ารหัส RSA นี่คือบทความเพย์วอลล์