RSA là hệ thống mật mã khóa công khai cung cấp mã hóa và chữ ký số dựa trên độ phức tạp tính toán của việc phân tích các số lớn thành thừa số. Theo NIST Special Publication 800-56B Rev. 2 (2023), RSA với độ dài khóa 2048 bit vẫn là tiêu chuẩn bảo mật cho các hệ thống chính phủ và thương mại. Thuật toán được sử dụng rộng rãi trong các giao thức TLS, chữ ký số và mã hóa dữ liệu trong các ứng dụng di động.
Các điểm chính
RSA là thuật toán mật mã khóa công khai được phát triển vào năm 1977 bởi Ron Rivest, Adi Shamir và Leonard Adleman. Tên được hình thành từ các chữ cái đầu tiên của họ của các tác giả. Thuật toán này trở thành hệ thống mật mã bất đối xứng đầu tiên có thể áp dụng thực tế, nơi khóa mã hóa và giải mã khác nhau.
Thuật toán RSA được công bố vào năm 1977 trên tạp chí Scientific American và dựa trên các công trình trước đó của Whitfield Diffie và Martin Hellman về mật mã khóa công khai. Viện Công nghệ Massachusetts đã nhận được bằng sáng chế cho RSA vào năm 1983, có hiệu lực đến năm 2000. Theo báo cáo của RSA Laboratories (2023), thuật toán vẫn là một trong những tiêu chuẩn mật mã phổ biến nhất trên thế giới — nó được sử dụng trong hàng tỷ thiết bị mỗi ngày.
Không giống như mật mã đối xứng, nơi cùng một khóa được sử dụng cho cả mã hóa và giải mã, RSA hoạt động với một cặp khóa liên kết toán học. Khóa công khai có thể được công bố cho bất kỳ ai mà không có nguy cơ xâm phạm hệ thống. Khóa riêng tư chỉ có chủ sở hữu biết và không bao giờ được truyền qua mạng. Theo nghiên cứu IBM Security X-Force Threat Intelligence Index (2024), mã hóa bất đối xứng được sử dụng trong 96% các giao thức truyền dữ liệu an toàn hiện đại.
Bảo mật của RSA dựa trên bài toán phân tích thừa số — phân tích tích của hai số nguyên tố lớn thành các thừa số. Nếu bạn chọn các số nguyên tố p và q, mỗi số 1024 bit, thì tích n của chúng sẽ là 2048 bit. Tính p và q khi chỉ biết n bằng các phương pháp hiện đại là thực tế không thể thực hiện được: theo đánh giá của chuyên gia CNRS (2024), việc phá vỡ RSA-2048 sẽ cần hơn 300 tỷ năm tính toán trên máy tính cổ điển.
Hãy xem xét toàn bộ quy trình làm việc của RSA từ tạo khóa đến mã hóa và giải mã thông điệp. Hiểu các giai đoạn này là cần thiết để triển khai chính xác thuật toán trong các ứng dụng di động.
Quá trình bắt đầu bằng việc chọn hai số nguyên tố lớn p và q. Mô-đun n = p x q được tính toán, xác định độ dài khóa. Sau đó, hàm Euler phi(n) = (p-1)(q-1) được tính. Một số mũ công khai e được chọn là nguyên tố cùng nhau với phi(n). Số mũ riêng d được tính là nghịch đảo nhân mô-đun của e modulo phi(n). Theo NIST SP 800-56B Rev. 2, độ dài tối thiểu của n phải là 2048 bit để đảm bảo bảo vệ đầy đủ.
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ã hóa thông điệp m, người gửi chuyển đổi nó thành một số nguyên nhỏ hơn n và tính bản mã c = m^e mod n. Người nhận sử dụng khóa riêng d để khôi phục thông điệp gốc: m = c^d mod n. Điều quan trọng cần lưu ý là RSA không nhằm mục đích mã hóa khối lượng dữ liệu lớn do hiệu suất thấp — kích thước thông điệp tối đa bằng độ dài khóa trừ đi các byte phụ (khoảng 190 byte cho RSA-2048 với 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 cũng được sử dụng để tạo chữ ký số — một cơ chế xác minh tính xác thực và toàn vẹn của dữ liệu. Chủ sở hữu ký băm thông điệp bằng khóa riêng của mình và bất kỳ ai cũng có thể xác minh chữ ký bằng khóa công khai. Theo báo cáo Sectigo Certificate Transparency (2025), hơn 85% chứng chỉ TLS trên internet sử dụng RSA cho chữ ký số, biến thuật toán thành nền tảng tin cậy cho truyền thông web.
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)
}
Độ dài khóa ảnh hưởng trực tiếp đến sức mạnh mật mã của RSA. Khi sức mạnh tính toán tăng lên, kích thước khóa tối thiểu chấp nhận được thường xuyên được các tổ chức tiêu chuẩn hóa quốc tế xem xét lại. Hãy xem xét các khuyến nghị hiện tại từ NIST và các cơ quan quản lý khác.
| Độ dài khóa | Tương đương đối xứng | Trạng thái |
|---|---|---|
| 1024 bit | 80 bit | Bị cấm từ năm 2023 |
| 2048 bit | 112 bit | Tiêu chuẩn tối thiểu |
| 3072 bit | 128 bit | Khuyến nghị cho hệ thống mới |
| 4096 bit | 256 bit | Cho dữ liệu bảo mật |
Việc tăng độ dài khóa RSA ảnh hưởng đáng kể đến thời gian thực hiện các thao tác. Tạo khóa 4096 bit mất khoảng 10 lần thời gian so với khóa 2048 bit. Các thao tác mã hóa và giải mã với khóa dài hơn đòi hỏi nhiều tài nguyên tính toán hơn, điều này rất quan trọng đối với thiết bị di động có mức tiêu thụ điện năng hạn chế.
Với sự phát triển của điện toán lượng tử, RSA có thể bị phá vỡ bằng thuật toán Shor trong thời gian đa thức. Thuật toán này, được Peter Shor đề xuất vào năm 1994, có thể phân tích các số lớn thành thừa số trong O((log n)^3) thao tác. Theo IBM Quantum Roadmap (2025), việc phá vỡ thực tế RSA-2048 dự kiến sẽ không xảy ra trước năm 2035, tuy nhiên NIST đã khuyến nghị chuyển đổi dần sang các thuật toán hậu lượng tử CRYSTALS-Kyber và CRYSTALS-Dilithium.
RSA được sử dụng tích cực trong các ứng dụng di động để đảm bảo truyền dữ liệu an toàn, xác thực máy chủ và bảo vệ giao dịch kỹ thuật số. Việc tích hợp được thực hiện thông qua các API mật mã tiêu chuẩn của cả hai nền tảng chính.
Nền tảng Android cung cấp Android Keystore — một kho lưu trữ khóa mật mã hệ thống được bảo vệ ở cấp độ phần cứng Trusted Execution Environment. Các khóa RSA được tạo trong KeyStore không thể bị trích xuất khỏi thiết bị ngay cả khi ứng dụng bị xâm phạm. Điều này cung cấp khả năng bảo vệ khỏi nhiều loại tấn công, bao gồm cả phần mềm độc hại có quyền truy cập root.
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()
}
Trên iOS, RSA được xử lý thông qua Security Framework với quyền truy cập Secure Enclave trên các thiết bị có chip A7 trở lên. Secure Enclave là một bộ đồng xử lý chuyên dụng được cách ly khỏi bộ xử lý chính, thực hiện các thao tác mật mã và lưu trữ khóa trong một kho phần cứng. Khóa RSA có thể được tạo cả bên trong Secure Enclave và trong Keychain phần mềm với các mức truy cập khác nhau.
Trong các ứng dụng di động thực tế, RSA hiếm khi được sử dụng để mã hóa trực tiếp dữ liệu lớn. Thực hành tiêu chuẩn là một sơ đồ kết hợp: ứng dụng tạo một khóa phiên AES, mã hóa nó bằng khóa công khai RSA của máy chủ và gửi đến máy chủ. Tất cả lưu lượng truy cập tiếp theo được mã hóa bằng AES, nhanh hơn 100-1000 lần so với truyền dữ liệu trực tiếp qua RSA.
Giống như bất kỳ thuật toán mật mã nào, RSA có điểm mạnh và điểm yếu cần được xem xét khi thiết kế các hệ thống bảo mật. Đánh giá khách quan giúp chọn công cụ phù hợp cho một nhiệm vụ cụ thể.
Ưu điểm chính của RSA là giải quyết vấn đề phân phối khóa cơ bản — khóa công khai có thể được công bố tự do mà không có nguy cơ xâm phạm toàn bộ hệ thống. Tính linh hoạt của thuật toán được thể hiện qua việc hỗ trợ cả mã hóa và chữ ký số với một cặp khóa duy nhất. Ngoài ra, RSA có hệ sinh thái hỗ trợ rộng lớn: các thư viện có sẵn cho tất cả ngôn ngữ và nền tảng.
Nhược điểm chính của RSA là hiệu suất thấp so với các thuật toán đối xứng. Giải mã RSA-2048 trên bộ xử lý di động hiện đại mất khoảng 5-15 mili giây, trong khi AES-256 xử lý hàng gigabyte dữ liệu trong cùng thời gian đó. Ngoài ra, RSA dễ bị tấn công lượng tử thông qua thuật toán Shor, điều này hạn chế việc sử dụng nó trong các hệ thống yêu cầu bảo vệ dữ liệu dài hạn.
Đối với các dự án di động, các chuyên gia NIST khuyến nghị: chỉ sử dụng RSA cho mã hóa khóa và chữ ký số, chọn độ dài khóa ít nhất 3072 bit cho các dự án mới, kết hợp RSA với AES trong sơ đồ kết hợp và theo dõi sự phát triển của các tiêu chuẩn hậu lượng tử để di chuyển có kế hoạch trong dài hạn.
Câu hỏi thường gặp
RSA là thuật toán bất đối xứng với một cặp khóa được sử dụng để mã hóa khối lượng dữ liệu nhỏ và chữ ký số. AES là thuật toán đối xứng với một khóa dùng chung duy nhất, hoạt động nhanh hơn RSA 100-1000 lần. Trong các hệ thống hiện đại, chúng được kết hợp: RSA bảo vệ việc truyền khóa phiên AES, trong khi AES mã hóa lưu lượng chính.
Kích thước an toàn tối thiểu từ năm 2023 là RSA-2048 theo NIST SP 800-131A Rev. 2. Khóa 1024 bit chính thức bị cấm đối với các hệ thống chính phủ Hoa Kỳ. Đối với các dự án mới, 3072 bit được khuyến nghị, cung cấp biên an toàn và sức mạnh tương đương với mã hóa đối xứng 128 bit.
Có, RSA được sử dụng rộng rãi trong các ứng dụng di động. Android cung cấp Android KeyStore để tạo phần cứng và lưu trữ an toàn các khóa RSA. iOS cung cấp Security Framework với hỗ trợ Secure Enclave. Đối với mã hóa dữ liệu lớn, sơ đồ kết hợp RSA + AES được khuyến nghị, trong đó RSA chỉ mã hóa khóa phiên.
Trên máy tính cổ điển, việc phá vỡ RSA-2048 là thực tế không thể — theo ước tính hiện tại, sẽ cần hơn 300 tỷ năm tính toán liên tục. Tuy nhiên, một máy tính lượng tử với đủ qubit có thể phá vỡ RSA-2048 trong vài phút bằng thuật toán Shor. Theo ước tính của IBM, máy tính như vậy sẽ không xuất hiện trước năm 2035.
Trong số các thuật toán bất đối xứng, ECC (Mật mã đường cong Elliptic) rất phổ biến, cung cấp bảo mật tương đương với độ dài khóa ngắn hơn — ECC 256 bit tương đương với RSA-3072. Cho kỷ nguyên hậu lượng tử, NIST đã chọn CRYSTALS-Kyber cho mã hóa và CRYSTALS-Dilithium cho chữ ký số vào năm 2024.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm