Bài RSA kết bằng một gợi ý: đường cong elliptic (EC) cho cùng mức an toàn với khóa nhỏ hơn nhiều. Đây là lý do TLS 1.3, chứng chỉ hiện đại, SSH key mới, và ví blockchain gần như đều chuyển sang EC. Nhiều người nghe "elliptic curve" là thấy toán học đáng sợ, nhưng với lập trình viên chỉ cần nắm ba điều thực dụng: EC an toàn cỡ nào so với RSA, khóa nhỏ hơn bao nhiêu, và nhanh hơn/chậm hơn ở chỗ nào. Bài này đo thật cả ba bằng openssl 3.0.

Vì sao EC khóa nhỏ mà vẫn an toàn

RSA dựa vào độ khó của việc phân tích thừa số nguyên tố một số rất lớn. EC dựa vào một bài toán khó khác: logarit rời rạc trên đường cong elliptic (ECDLP). Điểm mấu chốt: với cùng độ dài bit, ECDLP khó hơn bài toán của RSA — nên EC đạt cùng mức an toàn với khóa ngắn hơn nhiều:

EC 256-bit  ~  RSA 3072-bit   (cùng mức an toàn ~128 bit)
EC 384-bit  ~  RSA 7680-bit

EC được dùng qua hai họ thuật toán: ECDH (trao đổi khóa — bài sau, nền của TLS 1.3) và ECDSA/EdDSA (chữ ký số — JWT ES256, chứng chỉ, SSH ed25519).

openssl ecparam -list_curves                              # đường cong hỗ trợ
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.pem
openssl speed ecdsap256 rsa3072                           # so tốc độ

Ảnh chụp đoạn mã nền tối giải thích đường cong elliptic EC an toàn ngang RSA mà khóa nhỏ hơn, EC dựa trên bài toán khó khác nên khóa gọn hơn RSA dựa vào phân tích thừa số nguyên tố của số rất lớn EC dựa vào bài toán logarit rời rạc trên đường cong elliptic ECDLP khó hơn với cùng độ dài bit nên đạt cùng an toàn với khóa nhỏ hơn EC 256-bit tương đương RSA 3072-bit cùng mức an toàn 128 bit EC 384-bit tương đương RSA 7680-bit, dùng ở đâu ECDH trao đổi khóa nền của TLS 1.3 ECDSA EdDSA chữ ký số JWT ES256 chứng chỉ SSH ed25519 TLS chứng chỉ Let's Encrypt SSH key hiện đại đa số dùng EC, openssl với đường cong openssl ecparam -list_curves liệt kê openssl genpkey -algorithm EC pkeyopt ec_paramgen_curve P-256 sinh khóa openssl speed ecdsap256 rsa3072 so tốc độ P-256 prime256v1 phổ biến nhất secp384r1 khi cần mạnh hơn

Hình 1: EC dựa trên ECDLP nên đạt cùng an toàn với khóa nhỏ hơn RSA (EC 256 ≈ RSA 3072). Dùng cho ECDH (trao khóa) và ECDSA/EdDSA (chữ ký). openssl liệt kê đường cong, sinh khóa và đo tốc độ.

Đo thật: kích thước khóa và tốc độ

So khóa EC P-256 với RSA 3072 (cùng mức an toàn ~128 bit):

Ảnh chụp bảng kết quả đo thật nền tối chạy openssl 3.0 EC P-256 vs RSA 3072 cùng mức an toàn 128 bit, phần một kích thước khóa EC nhỏ hơn nhiều khóa riêng file EC P-256 241 byte RSA 3072 2484 byte khóa công khai EC P-256 178 byte RSA 3072 625 byte EC khóa riêng nhỏ hơn khoảng 10 lần công khai khoảng 3.5 lần, phần hai tốc độ ký và xác thực openssl speed sign trên giây verify trên giây ECDSA P-256 93175 và 31320 RSA 3072 1036 và 56068 EC ký nhanh hơn khoảng 90 lần RSA xác thực nhanh hơn khoảng 1.8 lần, phần ba đường cong openssl hỗ trợ prime256v1 P-256 phổ biến nhất secp384r1 P-384 khi cần mạnh hơn secp521r1 P-521

Hình 2: Khóa riêng EC P-256 chỉ 241 byte so với RSA 3072 là 2484 byte (nhỏ hơn ~10 lần); công khai 178 vs 625 byte. Tốc độ: ECDSA ký 93175/s vs RSA 1036/s (EC nhanh hơn ~90 lần); nhưng RSA xác thực 56068/s vs ECDSA 31320/s (RSA nhanh hơn ~1.8 lần).

Kết quả rõ ràng và có sắc thái:

  • Khóa EC nhỏ hơn nhiều: khóa riêng EC P-256 chỉ 241 byte file so với RSA 3072 là 2484 byte (~10 lần), khóa công khai 178 vs 625 byte. Khóa nhỏ nghĩa là chứng chỉ nhẹ hơn, bắt tay TLS ít byte hơn, lưu trữ gọn hơn — đáng kể ở quy mô lớn và trên thiết bị hạn chế.
  • ECDSA ký nhanh hơn hẳn: 93175 chữ ký/giây so với RSA 3072 chỉ 1036/giây — ~90 lần. Với hệ thống ký nhiều (token, log, giao dịch), EC thắng lớn.
  • Nhưng RSA xác thực nhanh hơn: RSA 3072 verify 56068/s so với ECDSA 31320/s — RSA nhanh hơn ~1.8 lần ở khâu xác thực. Đây là đánh đổi thật: RSA có phép verify rẻ (số mũ công khai nhỏ). Với chứng chỉ (ký một lần, verify hàng triệu lần), điểm này từng là lý do RSA phổ biến — nhưng lợi thế khóa nhỏ + ký nhanh của EC nay thường lấn át.

Đánh đổi và lưu ý

Chọn đường cong uy tín, và cân nhắc Ed25519. P-256 (prime256v1) là mặc định an toàn và phổ biến nhất; secp384r1 khi cần biên an toàn cao hơn. Với chữ ký, Ed25519 (EdDSA) hiện được ưa chuộng: nhanh, cài đặt an toàn (không cần nonce ngẫu nhiên mỗi lần như ECDSA), khóa siêu gọn — SSH và nhiều hệ thống mới mặc định dùng. Tránh các đường cong lạ/không chuẩn.

ECDSA rất nhạy với nonce. ECDSA cần một nonce ngẫu nhiên cho mỗi chữ ký; nonce trùng hay đoán được làm lộ khóa riêng (Sony PS3 từng bị hạ vì dùng nonce cố định). Đây là lý do Ed25519 (sinh nonce tất định từ khóa + thông điệp) an toàn hơn trong thực tế. Nếu dùng ECDSA, để thư viện lo nonce, đừng tự cài.

EC không phải "thay thế mọi thứ". EC không dùng để mã hóa dữ liệu trực tiếp (giống RSA cũng không nên). EC lo trao khóa (ECDH) và ký (ECDSA/EdDSA); dữ liệu vẫn mã bằng AES. Và như RSA, khóa riêng EC phải được bảo vệ tuyệt đối.

Ba ý mang về

  1. EC đạt cùng an toàn với khóa nhỏ hơn nhiều nhờ dựa trên ECDLP: EC 256-bit ≈ RSA 3072-bit — đo thật, khóa riêng EC P-256 241 byte so với RSA 3072 là 2484 byte (~10 lần nhỏ hơn).
  2. Tốc độ có đánh đổi: ECDSA ký nhanh hơn RSA ~90 lần (93175 vs 1036/s), nhưng RSA xác thực nhanh hơn ~1.8 lần — chọn theo bạn ký nhiều hay verify nhiều; nhìn chung EC (khóa gọn + ký nhanh) là lựa chọn hiện đại.
  3. Dùng đúng: chọn đường cong chuẩn (P-256/P-384) hoặc Ed25519 (an toàn nonce hơn ECDSA); EC lo trao khóa/ký chứ không mã dữ liệu trực tiếp; bảo vệ khóa riêng và để thư viện lo nonce.

Nguồn

Phần sau ta dùng cặp khóa theo chiều ngược lại với mã hóa: chữ ký số — ký bằng khóa riêng, ai cũng xác thực bằng khóa công khai, đo thật bằng openssl dgst -sign/-verify.