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 độ

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):

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ề
- 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).
- 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.
- 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
- Cloudflare — A (relatively easy to understand) primer on elliptic curve cryptography: https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/
- OpenSSL docs — openssl-ecparam / openssl-speed: https://docs.openssl.org/3.0/man1/openssl-ecparam/
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.