RSA เป็นระบบเข้ารหัสคีย์สาธารณะที่ให้การเข้ารหัสและลายเซ็นดิจิทัลบนพื้นฐานของความซับซ้อนเชิงคำนวณของการแยกตัวประกอบจำนวนมาก ตาม NIST Special Publication 800-56B Rev. 2 (2023), RSA ที่มีความยาวคีย์ 2048 บิต ยังคงเป็นมาตรฐานความปลอดภัยสำหรับระบบของรัฐบาลและเชิงพาณิชย์ อัลกอริทึมนี้ถูกใช้อย่างแพร่หลายในโปรโตคอล TLS, ลายเซ็นดิจิทัล และการเข้ารหัสข้อมูลในแอปพลิเคชันโมบาย
ประเด็นสำคัญ
RSA เป็นอัลกอริทึมการเข้ารหัสคีย์สาธารณะที่พัฒนาในปี 1977 โดย Ron Rivest, Adi Shamir และ Leonard Adleman ชื่อนี้เกิดจากอักษรตัวแรกของนามสกุลของผู้เขียน อัลกอริทึมนี้กลายเป็นระบบเข้ารหัสแบบอสมมาตรที่ใช้งานได้จริงเป็นระบบแรกที่คีย์การเข้ารหัสและถอดรหัสแตกต่างกัน
อัลกอริทึม RSA ถูกตีพิมพ์ในปี 1977 ในนิตยสาร Scientific American และมีพื้นฐานมาจากงานก่อนหน้าของ Whitfield Diffie และ Martin Hellman เกี่ยวกับการเข้ารหัสคีย์สาธารณะ สถาบันเทคโนโลยีแมสซาชูเซตส์ได้รับสิทธิบัตรสำหรับ RSA ในปี 1983 ซึ่งมีผลจนถึงปี 2000 ตามรายงานของ RSA Laboratories (2023), อัลกอริทึมนี้ยังคงเป็นหนึ่งในมาตรฐานการเข้ารหัสที่ แพร่หลายที่สุด ในโลก — มันถูกใช้ในอุปกรณ์หลายพันล้านเครื่องทุกวัน
แตกต่างจากการเข้ารหัสแบบสมมาตรที่ใช้คีย์เดียวกันทั้งการเข้ารหัสและถอดรหัส RSA ทำงานกับคู่คีย์ที่เชื่อมโยงทางคณิตศาสตร์ คีย์สาธารณะสามารถเผยแพร่ให้ใครก็ได้โดยไม่มีความเสี่ยงต่อการถูกบุกรุกระบบ คีย์ส่วนตัวรู้เฉพาะเจ้าของและไม่เคยถูกส่งผ่านเครือข่าย ตามการศึกษา IBM Security X-Force Threat Intelligence Index (2024), การเข้ารหัสแบบอสมมาตรถูกใช้ใน 96% ของโปรโตคอลการส่งข้อมูลที่ปลอดภัยสมัยใหม่
ความปลอดภัยของ RSA ขึ้นอยู่กับปัญหาการแยกตัวประกอบ — การแยกผลคูณของจำนวนเฉพาะขนาดใหญ่ออกเป็นตัวประกอบ หากคุณเลือกจำนวนเฉพาะ p และ q ขนาด 1024 บิตแต่ละตัว ผลคูณ n ของพวกมันจะเท่ากับ 2048 บิต การคำนวณ p และ q โดยรู้เพียง n ด้วยวิธีการสมัยใหม่นั้นเป็นไปไม่ได้ในทางปฏิบัติ: ตามการประเมินของผู้เชี่ยวชาญ CNRS (2024), การถอดรหัส RSA-2048 จะต้องใช้เวลาคำนวณ มากกว่า 3 แสนล้าน ปีบนคอมพิวเตอร์แบบคลาสสิก
ลองพิจารณาวงจรการทำงานทั้งหมดของ RSA ตั้งแต่การสร้างคีย์ไปจนถึงการเข้ารหัสและถอดรหัสข้อความ การทำความเข้าใจขั้นตอนเหล่านี้จำเป็นสำหรับการ implement อัลกอริทึมที่ถูกต้องในแอปพลิเคชันโมบาย
กระบวนการเริ่มต้นด้วยการเลือกจำนวนเฉพาะขนาดใหญ่สองตัว p และ q คำนวณมอดุลัส n = p x q ซึ่งกำหนดความยาวของคีย์ จากนั้นคำนวณฟังก์ชันโทเทียนต์ของออยเลอร์ phi(n) = (p-1)(q-1) เลือกเลขชี้กำลังสาธารณะ e ที่เป็นจำนวนเฉพาะสัมพัทธ์กับ phi(n) เลขชี้กำลังส่วนตัว d คำนวณเป็นตัวผกผันการคูณแบบมอดุลาร์ของ e มอดุโล phi(n) ตาม NIST SP 800-56B Rev. 2, ความยาวขั้นต่ำของ n ต้องเป็น 2048 บิตเพื่อให้การป้องกันที่เพียงพอ
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.SecureRandom;
public class RSAKeyGenerator {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, new SecureRandom());
return generator.generateKeyPair();
}
}
ในการเข้ารหัสข้อความ m, ผู้ส่งแปลงเป็นจำนวนเต็มที่น้อยกว่า n และคำนวณข้อความเข้ารหัส c = m^e mod n ผู้รับใช้คีย์ส่วนตัว d เพื่อกู้คืนข้อความต้นฉบับ: m = c^d mod n สิ่งสำคัญที่ต้องทราบคือ RSA ไม่ได้ออกแบบมาสำหรับการเข้ารหัสข้อมูลปริมาณมากเนื่องจากประสิทธิภาพต่ำ — ขนาดข้อความสูงสุดเท่ากับความยาวคีย์ลบด้วยไบต์โอเวอร์เฮด (ประมาณ 190 ไบต์สำหรับ RSA-2048 ด้วย OAEP)
import javax.crypto.Cipher;
import java.security.PublicKey;
import java.util.Base64;
public class RSAEncryptor {
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
}
RSA ยังใช้สร้างลายเซ็นดิจิทัล — กลไกในการตรวจสอบความถูกต้องแท้จริงและความสมบูรณ์ของข้อมูล เจ้าของเซ็นแฮชของข้อความด้วยคีย์ส่วนตัวของตน และใครก็ตามสามารถตรวจสอบลายเซ็นโดยใช้คีย์สาธารณะ ตามรายงาน Sectigo Certificate Transparency (2025), มากกว่า 85% ของใบรับรอง TLS บนอินเทอร์เน็ตใช้ RSA สำหรับลายเซ็นดิจิทัล ทำให้อัลกอริทึมเป็นพื้นฐานของความไว้วางใจสำหรับการสื่อสารทางเว็บ
import java.security.Signature
fun signData(data: ByteArray, privateKey: java.security.PrivateKey): ByteArray {
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
return signature.sign()
}
fun verifySignature(
data: ByteArray, signedData: ByteArray, publicKey: java.security.PublicKey
): Boolean {
val signature = Signature.getInstance("SHA256withRSA")
signature.initVerify(publicKey)
signature.update(data)
return signature.verify(signedData)
}
ความยาวของคีย์ส่งผลโดยตรงต่อความแข็งแกร่งทางการเข้ารหัสของ RSA เมื่อพลังการคำนวณเพิ่มขึ้น ขนาดคีย์ขั้นต่ำที่ยอมรับได้จะถูกทบทวนเป็นประจำโดยองค์กรมาตรฐานระหว่างประเทศ มาดูคำแนะนำปัจจุบันจาก NIST และหน่วยงานกำกับดูแลอื่นๆ
| ความยาวคีย์ | เทียบเท่าสมมาตร | สถานะ |
|---|---|---|
| 1024 บิต | 80 บิต | ห้ามใช้ตั้งแต่ปี 2023 |
| 2048 บิต | 112 บิต | มาตรฐานขั้นต่ำ |
| 3072 บิต | 128 บิต | แนะนำสำหรับระบบใหม่ |
| 4096 บิต | 256 บิต | สำหรับข้อมูลลับ |
การเพิ่มความยาวคีย์ RSA ส่งผลอย่างมีนัยสำคัญต่อเวลาดำเนินการของการดำเนินการ การสร้างคีย์ 4096 บิตใช้เวลาประมาณ 10 เท่าของคีย์ 2048 บิต การดำเนินการเข้ารหัสและถอดรหัสด้วยคีย์ที่ยาวขึ้นต้องการทรัพยากรการคำนวณมากขึ้น ซึ่งสำคัญสำหรับ อุปกรณ์โมบาย ที่มีการใช้พลังงานจำกัด
ด้วยการพัฒนาของการคำนวณเชิงควอนตัม RSA สามารถถูกถอดรหัสได้โดยใช้อัลกอริทึมของชอร์ในเวลาพหุนาม อัลกอริทึมนี้ เสนอโดย Peter Shor ในปี 1994, สามารถแยกตัวประกอบจำนวนมากได้ใน O((log n)^3) การดำเนินการ ตาม IBM Quantum Roadmap (2025), การถอดรหัส RSA-2048 ในทางปฏิบัติคาดว่าจะไม่เกิดขึ้นก่อนปี 2035 อย่างไรก็ตาม NIST แนะนำให้ เปลี่ยนผ่านอย่างค่อยเป็นค่อยไป ไปยังอัลกอริทึมหลังควอนตัม CRYSTALS-Kyber และ CRYSTALS-Dilithium
RSA ถูกใช้อย่างแข็งขันในแอปพลิเคชันโมบายเพื่อรับประกันการส่งข้อมูลที่ปลอดภัย การตรวจสอบสิทธิ์เซิร์ฟเวอร์ และการป้องกันธุรกรรมดิจิทัล การผสานรวมดำเนินการผ่าน API การเข้ารหัสมาตรฐานของทั้งสองแพลตฟอร์มหลัก
แพลตฟอร์ม Android มี Android Keystore — พื้นที่จัดเก็บคีย์การเข้ารหัสของระบบที่ป้องกันโดยระดับฮาร์ดแวร์ Trusted Execution Environment คีย์ RSA ที่สร้างใน KeyStore ไม่สามารถถูกแยกออกจากอุปกรณ์ได้แม้แอปพลิเคชันจะถูกบุกรุก ซึ่งให้การป้องกันการโจมตีที่หลากหลาย รวมถึงมัลแวร์ที่มีสิทธิ์รูท
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyPairGenerator
fun generateKeyInAndroidKeystore() {
val generator = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
)
val spec = KeyGenParameterSpec.Builder(
"rsa_key_pair",
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setKeySize(2048)
.setBlockModes(KeyProperties.BLOCK_MODE_ECB)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.build()
generator.initialize(spec)
val keyPair = generator.generateKeyPair()
}
บน iOS, RSA ถูกจัดการผ่าน Security Framework ด้วยการเข้าถึง Secure Enclave บนอุปกรณ์ที่มีชิป A7 ขึ้นไป Secure Enclave คือโคโปรเซสเซอร์เฉพาะที่แยกจากโปรเซสเซอร์หลักซึ่งดำเนินการเข้ารหัสและเก็บคีย์ในห้องนิรภัยฮาร์ดแวร์ คีย์ RSA สามารถสร้างได้ทั้งภายใน Secure Enclave และใน Keychain ซอฟต์แวร์ด้วยระดับ การเข้าถึง ที่แตกต่างกัน
ในแอปพลิเคชันโมบายจริง RSA ไม่ค่อยถูกใช้สำหรับการเข้ารหัสข้อมูลขนาดใหญ่โดยตรง แนวทางปฏิบัติมาตรฐานคือรูปแบบผสมผสาน: แอปพลิเคชันสร้างคีย์เซสชัน AES, เข้ารหัสด้วยคีย์สาธารณะ RSA ของเซิร์ฟเวอร์ และส่งไปยังเซิร์ฟเวอร์ ทราฟฟิกที่ตามมาทั้งหมดถูกเข้ารหัสด้วย AES ซึ่งเร็วกว่าการส่งข้อมูลโดยตรงผ่าน RSA 100-1000 เท่า
เช่นเดียวกับอัลกอริทึมการเข้ารหัสใดๆ RSA มีจุดแข็งและจุดอ่อนที่ต้องพิจารณาเมื่อออกแบบระบบที่ปลอดภัย การประเมินอย่างเป็นกลางช่วยเลือกเครื่องมือที่เหมาะสมสำหรับงานเฉพาะ
ข้อได้เปรียบหลักของ RSA คือการแก้ปัญหาการกระจายคีย์พื้นฐาน — คีย์สาธารณะสามารถเผยแพร่ได้อย่างอิสระโดยไม่มีความเสี่ยงต่อการถูกบุกรุกทั้งระบบ ความอเนกประสงค์ของอัลกอริทึมแสดงให้เห็นในการรองรับทั้งการเข้ารหัสและ ลายเซ็นดิจิทัล ด้วยคู่คีย์เดียว นอกจากนี้ RSA มีระบบนิเวศสนับสนุนที่กว้างขวาง: ไลบรารีพร้อมใช้งานสำหรับทุกภาษาและทุกแพลตฟอร์ม
ข้อเสียหลักของ RSA คือประสิทธิภาพต่ำเมื่อเทียบกับอัลกอริทึมแบบสมมาตร การถอดรหัส RSA-2048 บนโปรเซสเซอร์โมบายสมัยใหม่ใช้เวลาประมาณ 5-15 มิลลิวินาที ในขณะที่ AES-256 ประมวลผลข้อมูลกิกะไบต์ในเวลาเดียวกัน นอกจากนี้ RSA ยังเสี่ยงต่อการโจมตีเชิงควอนตัมผ่านอัลกอริทึมของชอร์ ซึ่งจำกัดการใช้งานในระบบที่ต้องการการปกป้องข้อมูลระยะยาว
สำหรับโครงการโมบาย ผู้เชี่ยวชาญ NIST แนะนำ: ใช้ RSA เฉพาะสำหรับการเข้ารหัสคีย์และลายเซ็นดิจิทัล เลือกความยาวคีย์อย่างน้อย 3072 บิตสำหรับโครงการใหม่ รวม RSA กับ AES ในรูปแบบผสมผสาน และติดตามการพัฒนามาตรฐานหลังควอนตัมสำหรับการย้ายระบบตามแผนในระยะยาว
คำถามที่พบบ่อย
RSA เป็นอัลกอริทึมแบบอสมมาตรที่มีคู่คีย์ใช้สำหรับเข้ารหัสข้อมูลปริมาณน้อยและลายเซ็นดิจิทัล AES เป็นอัลกอริทึมแบบสมมาตรที่มีคีย์ร่วมเดียว ทำงานเร็วกว่า RSA 100-1000 เท่า ในระบบสมัยใหม่จะถูกรวมกัน: RSA ปกป้องการส่งคีย์เซสชัน AES ในขณะที่ AES เข้ารหัส ทราฟฟิกหลัก
ขนาดปลอดภัยขั้นต่ำตั้งแต่ปี 2023 คือ RSA-2048 ตาม NIST SP 800-131A Rev. 2 คีย์ 1024 บิตถูกห้ามอย่างเป็นทางการสำหรับระบบของรัฐบาลสหรัฐฯ สำหรับโครงการใหม่ แนะนำ 3072 บิต ซึ่งให้ส่วนต่างความปลอดภัยและความแข็งแกร่งเทียบเท่ากับการเข้ารหัสแบบสมมาตร 128 บิต
ได้, RSA ถูกใช้อย่างแพร่หลายในแอปพลิเคชันโมบาย Android มี Android KeyStore สำหรับการสร้างฮาร์ดแวร์และการจัดเก็บคีย์ RSA อย่างปลอดภัย iOS มี Security Framework รองรับ Secure Enclave สำหรับการเข้ารหัสข้อมูลขนาดใหญ่ แนะนำรูปแบบผสมผสาน RSA + AES โดย RSA เข้ารหัสเฉพาะ คีย์เซสชัน
บนคอมพิวเตอร์แบบคลาสสิก การถอดรหัส RSA-2048 เป็นไปไม่ได้ในทางปฏิบัติ — ตามการประมาณการปัจจุบัน จะต้องใช้เวลาคำนวณต่อเนื่องมากกว่า 3 แสนล้านปี อย่างไรก็ตาม คอมพิวเตอร์ควอนตัมที่มีควิบิตเพียงพอสามารถถอดรหัส RSA-2048 ได้ในไม่กี่นาทีโดยใช้อัลกอริทึมของชอร์ ตามการประมาณการของ IBM คอมพิวเตอร์ดังกล่าวจะไม่ปรากฏ ก่อนปี 2035
ในบรรดาอัลกอริทึมแบบอสมมาตร ECC (Elliptic Curve Cryptography) เป็นที่นิยม ให้ความปลอดภัยเทียบเท่าโดยมีความยาวคีย์สั้นกว่า — ECC 256 บิตเทียบเท่ากับ RSA-3072 สำหรับยุคหลังควอนตัม NIST เลือก CRYSTALS-Kyber สำหรับการเข้ารหัสและ CRYSTALS-Dilithium สำหรับ ลายเซ็นดิจิทัล ในปี 2024
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม