pprime×qprime=n = pq2048 bitseasy forward, hard reversefactoring n breaks RSA

Mã hóa RSA

11 đọc tối thiểumật mã

RSA là thuật toán khóa công khai thực tế đầu tiên - thuật toán cho phép hai người trao đổi bí mật mà không cần gặp mặt trực tiếp. Bốn mươi tám năm sau, nó vẫn bảo mật một phần đáng kể các bắt tay TLS, ký mọi tin nhắn PGP và củng cố nhiều chương trình ký mã. Dần dần được thay thế bằng các đường cong elip nhưng không biến mất.

Toàn bộ nội dung bài viết được cung cấp bằng tiếng Anh bên dưới.

RSA là một hệ thống mật mã khóa công khai được Ron Rivest, Adi Shamir và Leonard Adleman tại MIT giới thiệu vào năm 1977. Bằng sáng chế hết hạn vào năm 2000, sau đó nó lan rộng đến mọi thư viện mật mã. RSA cho phép hai hoạt động bổ sung: mã hóa bằng khóa chung để chỉ khóa riêng có thể giải mã và ký bằng khóa riêng để bất kỳ ai có khóa chung đều có thể xác minh.

Bài toán, nói ngắn gọn, tính bảo mật của

RSA dựa trên khó khăn trong việc phân tích các số lớn. Tạo khóa:

  1. PChọn hai số nguyên tố ngẫu nhiên lớn pq (mỗi số thường có 2048 bit).
  2. Tính toán n = p × q. Đây là môđun công khai.
  3. Tính tổng Euler: φ(n) = (p-1)(q-1).
  4. Chọn một e lẻ nhỏ cùng nguyên tố với φ(n). Thông thường là 65537 (=2^16+1).
  5. Tính d = e^(-1) mod φ(n). Đây là khóa riêng.

Khóa chung là cặp (n, e); khóa riêng là d.

Để mã hóa tin nhắn m: ciphertext c = m^e mod n. Để giải mã: m = c^d mod n. Bất kỳ ai có khóa chung đều có thể mã hóa; chỉ người có khóa riêng mới có thể giải mã được. Để ký, ngược lại: s = m^d mod n, xác minh bằng m = s^e mod n.

Tại sao điều này lại hiệu quả

Mẹo: tính toán d yêu cầu biết φ(n), đòi hỏi phải phân tích n vào p × q. Việc phân tích một nửa nguyên tố 2048-bit cần nhiều tính toán hơn con người. Việc xác minh n = p × q khi bạn đã biết pq là chuyện nhỏ. Tính bất đối xứng — nhân dễ, phân tích nhân tử khó — là toàn bộ nền tảng của RSA.

Kích thước khóa

  • RSA-1024 — bị phá vỡ về nguyên tắc bởi các đối thủ có nguồn lực tốt; NIST đã cấm nó đối với các hoạt động triển khai mới kể từ năm 2014.
  • RSA-2048 — đường cơ sở hiện tại. Được coi là an toàn trong trung hạn trước các đối thủ cổ điển.
  • RSA-3072 — được đề xuất cho các hoạt động triển khai mới theo tiến trình chuyển đổi năm 2030 của NIST.
  • RSA-4096 — phổ biến để ký mã trong đó khóa có thời hạn 10–20 năm. Chậm hơn nhưng an toàn một cách thận trọng.

RSA trong thực tế

RSA hầu như không bao giờ mã hóa trực tiếp các tin nhắn lớn. Quá trình này chậm — việc mã hóa một kilobyte cần hàng nghìn phép tính lũy thừa mô-đun. Thay vào đó, RSA được sử dụng trong mã hóa lai : tạo khóa AES ngẫu nhiên, mã hóa dữ liệu bằng AES, chỉ mã hóa khóa AES bằng RSA. Bên giải mã RSA giải mã khóa, sau đó AES giải mã dữ liệu. Mọi bắt tay TLS RSA đều hoạt động theo cách này; mọi email được mã hóa PGP đều hoạt động theo cách này.

PVấn đề đệm

Plain ("sách giáo khoa") RSA — mã hóa m trực tiếp mà không cần đệm — là cực kỳ thiếu an toàn. Nhiều cuộc tấn công khai thác tính linh hoạt, thiếu tính ngẫu nhiên và các trường hợp khó khăn như m nhỏ. RSA thực sử dụng sơ đồ đệm:

  • PKCS#1 v1.5 đệm — đệm ban đầu; dễ bị tấn công bởi Bleichenbacher nếu việc triển khai bị rò rỉ liệu phần đệm có hợp lệ hay không. Vẫn được triển khai rộng rãi.
  • OAEP (Đệm mã hóa bất đối xứng tối ưu) — phần đệm hiện đại; chống lại các cuộc tấn công bằng bản mã đã chọn. Sử dụng công cụ này để mã hóa RSA mới.
  • PSS (Lược đồ chữ ký xác suất) — phần đệm chữ ký hiện đại; vượt trội hơn PKCS#1 v1.5 để ký.

Lược đồ đệm là một phần của giao thức được triển khai, không phải là tùy chọn. Những sai lầm trong quá trình triển khai phần đệm là nguồn phổ biến nhất của lỗ hổng RSA trong các hệ thống thực. Sự ngừng hoạt động chậm của

RSA

RSA đang được thay thế vì hai lý do:

  • Kích thước khóa.Khóa RSA-3072 lớn hơn các phím đường cong elip tương đương bởi 10×. Chi phí lưu trữ và bắt tay TLS tăng lên theo quy mô.
  • Kháng lượng tử. Một máy tính lượng tử đủ lớn sẽ tính RSA thông qua thuật toán Shor trong thời gian đa thức. ECC cũng dễ bị tấn công nhưng các giải pháp thay thế kháng lượng tử lại dễ triển khai hơn.

TLS 1.3 đã ngừng trao đổi khóa RSA để chuyển sang ECDHE. Việc ký kết cơ quan cấp chứng chỉ hiện đại đang chuyển sang ECDSA. RSA vẫn tồn tại để có khả năng tương thích với cơ sở đã cài đặt (PGP, JWT, thẻ thông minh, ký mã) và sẽ duy trì trong nhiều năm.

Câu hỏi hậu lượng tử

Ngay cả khi máy tính lượng tử có khả năng phá vỡ RSA cách đây hàng thập kỷ, dữ liệu được mã hóa có giá trị lâu dài vẫn đang được thu thập ngày nay với giả định rằng nó có thể được giải mã sau này. Điện tín của chính phủ, hồ sơ y tế, sở hữu trí tuệ - "thu hoạch ngay, giải mã sau" là mô hình mối đe dọa hiện nay. Các tiêu chuẩn hậu lượng tử của NIST (CRYSTALS-Kyber để đóng gói khóa, CRYSTALS-Dilithium cho chữ ký) đang được triển khai cùng với RSA trong cấu hình kết hợp. Việc triển khai RSA thuần túy cho dữ liệu bí mật dài hạn ngày càng được coi là không đủ.

Câu hỏi thường gặp

RSA có còn an toàn vào năm 2026 không?
Chống lại các đối thủ cổ điển, RSA-2048 và lớn hơn vẫn an toàn. Mật mã không có điểm đột phá thực tế nào được biết đến. Chống lại các đối thủ lượng tử trong tương lai, RSA có thể bị phá vỡ trong thời gian đa thức một khi phần cứng lượng tử đủ lớn tồn tại - có thể là 5–20 năm nữa. Dữ liệu bí mật dài hạn đã được chuyển sang các sơ đồ hậu lượng tử lai.
Tại sao RSA lại chậm so với AES?
RSA là một thuật toán khóa công khai (bất đối xứng) dựa trên lũy thừa mô-đun rất lớn; AES là một thuật toán đối xứng hoạt động trên các khối 128 bit với khả năng tăng tốc phần cứng. AES nhanh hơn khoảng 1000 × mỗi byte. Đó là lý do tại sao hầu hết tất cả các hệ thống thực chỉ sử dụng RSA để trao đổi khóa phiên, sau đó mã hóa dữ liệu hàng loạt bằng AES.
Sự khác biệt giữa mã hóa RSA và chữ ký RSA là gì?
Họ sử dụng cùng một phép toán theo hướng ngược lại. Mã hóa: mã hóa bằng khóa chung, giải mã bằng khóa riêng. Chữ ký: “mã hóa” bằng khóa riêng (gọi là ký), “giải mã” bằng khóa chung (gọi là xác minh). Các nguyên tắc mã hóa khác nhau về chi tiết (phần đệm) và bạn không bao giờ nên sử dụng cùng một khóa cho cả hai - khóa ký và mã hóa riêng biệt là tiêu chuẩn.
Tại sao 65537 được sử dụng làm số mũ công khai RSA?
Đó là số nguyên tố Fermat (2^16 + 1), đủ nhỏ để mã hóa/xác minh nhanh chóng (chỉ 17 phép nhân), với biểu diễn nhị phân thưa thớt cho phép tính toán hiệu quả. Giá trị lớn hơn hoặc nhỏ hơn hoạt động nhưng chậm hơn hoặc có rủi ro dễ bị tổn thương tinh tế. 65537 đã trở nên phổ biến theo quy ước.
Tôi có thể tạo khóa RSA của riêng mình một cách an toàn không?
Sử dụng thư viện đã được kiểm tra kỹ lưỡng (OpenSSL, libsodium, GnuPG) và CSPRNG. Đừng bao giờ thực hiện bài kiểm tra tính nguyên thủy của riêng bạn hoặc triển khai RSA từ đầu — các dạng lỗi rất khó phát hiện và rất thảm khốc. Tạo khóa thông qua <code>ssh-keygen -t rsa -b 3072</code> hoặc tương đương là được; tự viết phép tính thì không.
Giải thích về mã hóa RSA: Thuật toán làm cho mật mã khóa công khai trở nên thực tế