Mã hóa RSA bằng khóa công khai

Mã hóa thông điệp ngắn bằng khóa công khai RSA (PEM) với RSA-OAEP SHA-256, OAEP SHA-1 hoặc PKCS#1 v1.5. Tạo cặp khóa thử nghiệm chỉ với một cú bấm. Chỉ chạy cục bộ.

OAEP là kiểu đệm được khuyên dùng. MGF1 dùng cùng hàm băm, giống Web Crypto và openssl pkeyutl -pkeyopt rsa_oaep_md.

RSA chỉ mã hóa được dữ liệu ngắn: với khóa 2048 bit tối đa 190 byte (OAEP SHA-256), 214 byte (OAEP SHA-1) hoặc 245 byte (PKCS#1 v1.5). Dữ liệu dài hơn hãy mã hóa bằng AES và chỉ dùng RSA để mã hóa khóa AES.

Mã hóa RSA có tính ngẫu nhiên: mã hóa cùng một văn bản hai lần sẽ ra hai bản mã khác nhau, và cả hai đều giải mã đúng.

Chạy hoàn toàn trong trình duyệt. Dữ liệu của bạn không bao giờ bị tải lên.

Mã hóa RSA là gì?

Mã hóa một thông điệp ngắn hoặc một khóa đối xứng bằng khóa công khai RSA định dạng PEM (SPKI BEGIN PUBLIC KEY, PKCS#1 BEGIN RSA PUBLIC KEY, chứng chỉ X.509 hoặc khóa bí mật mà từ đó lấy phần công khai). Chỉ người giữ khóa bí mật tương ứng mới giải mã được kết quả.

Cách sử dụng Mã hóa RSA

  1. Dán Khóa công khai (PEM) của người nhận, hoặc bấm Tạo cặp khóa thử nghiệm (2048 bit) để dùng thử.
  2. Chọn Kiểu đệm (padding): khuyên dùng RSA-OAEP (SHA-256); hãy khớp với những gì mã bên nhận mong đợi.
  3. Gõ Bản rõ (hoặc đổi mã hóa đầu vào sang Hex để mã hóa byte thô như khóa AES).
  4. Bấm Mã hóa và sao chép bản mã Base64 hoặc Hex.

Ví dụ

Đầu vào
"Hello RSA" với khóa công khai 2048 bit, RSA-OAEP (SHA-256), kết quả Base64
Đầu ra
Một chuỗi Base64 dài 344 ký tự (256 byte), thay đổi sau mỗi lần chạy

RSA-OAEP được ngẫu nhiên hóa nên không có kết quả cố định; giải mã bằng khóa bí mật sẽ trả về "Hello RSA".

Khi nào nên dùng Mã hóa RSA

Dùng RSA để mã hóa bí mật nhỏ – mật khẩu, token hoặc khóa AES tạo ngẫu nhiên – cho người mà bạn có khóa công khai. Đừng dùng cho dữ liệu lớn: hãy mã hóa dữ liệu bằng AES và chỉ mã hóa khóa AES bằng RSA (mã hóa lai), hoặc dùng PGP. Ưu tiên OAEP; chỉ dùng PKCS#1 v1.5 nếu hệ thống cũ yêu cầu.

Mã hóa RSA hoạt động như thế nào

Mã hóa RSA tính c = mᵉ mod n trên thông điệp đã đệm. OAEP (PKCS#1 v2.2) che thông điệp bằng MGF1 dùng SHA-256 hoặc SHA-1 và các byte seed ngẫu nhiên; PKCS#1 v1.5 thêm phần đệm ngẫu nhiên khác 0 vào đầu. Phần đệm được ngẫu nhiên hóa, nên mã hóa cùng văn bản hai lần cho hai bản mã khác nhau. Bản mã dài bằng modulus (256 byte với khóa 2048 bit). Kích thước thông điệp tối đa là k − 2·hLen − 2 byte với OAEP và k − 11 với v1.5 (190, 214 và 245 byte với khóa 2048 bit). Khóa được phân tích và việc mã hóa được thực hiện bằng node-forge; kết quả tương thích với OpenSSL, Web Crypto và Node.js.

Các Trường Hợp Sử Dụng Phổ Biến

  • Mã hóa khóa phiên AES để kiểm thử mã hóa lai
  • Kiểm tra backend có giải mã được bản mã OAEP-SHA256 từ trình duyệt không
  • Gửi một bí mật ngắn cho người đã đưa bạn khóa công khai
  • Tạo dữ liệu kiểm thử PKCS#1 v1.5 cho API cũ
  • Tìm hiểu giới hạn kích thước thông điệp RSA phụ thuộc độ dài khóa và kiểu đệm thế nào

Lưu Ý Bảo Mật

Khóa và thông điệp chỉ được xử lý trong trình duyệt của bạn. Đừng dán khóa bí mật production vào bất kỳ website nào bạn không kiểm soát – hãy tạo cặp khóa thử nghiệm thay vào đó.

Câu Hỏi Thường Gặp

Vì sao thông điệp của tôi quá dài?

RSA chỉ mã hóa được vài trăm byte. Với khóa 2048 bit, OAEP SHA-256 cho phép 190 byte. Hãy mã hóa dữ liệu dài hơn bằng AES và chỉ dùng RSA cho khóa AES.

Nên chọn kiểu đệm nào?

RSA-OAEP với SHA-256 cho hệ thống mới (Web Crypto RSA-OAEP với hash: 'SHA-256', OpenSSL pkeyutl -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256). OAEP SHA-1 là mặc định của nhiều thư viện cũ (Java RSA/ECB/OAEPWithSHA-1AndMGF1Padding). PKCS#1 v1.5 chỉ để tương thích với hệ thống cũ.

Vì sao bản mã thay đổi mỗi lần?

Cả hai kiểu đệm đều thêm byte ngẫu nhiên trước khi mã hóa. Điều này ngăn kẻ tấn công đoán thông điệp ngắn bằng cách tự mã hóa các ứng viên.

Tôi có mã hóa bằng khóa bí mật được không?

Bạn có thể dán khóa bí mật – phần công khai của nó được dùng để mã hóa. "Mã hóa bằng khóa bí mật" theo nghĩa ký số là một phép toán khác và không có ở đây.

Khám phá thêm danh mục