
Diffie-Hellman là thuật toán thỏa thuận khóa cho phép hai bên tự tạo ra cùng một bí mật chung qua kênh công khai, mà không cần trước bất kỳ khoá bí mật nào. Đây là nền tảng của mọi kết nối mã hoá hiện đại, từ TLS 1.3 trên trình duyệt cho tới giao thức nhắn tin Signal.

Ý tưởng cốt lõi
Trước Diffie-Hellman, muốn hai máy nói chuyện riêng tư, người ta phải giao khóa trước mặt nhau, hoặc nhờ một kênh truyền đã được mã hoá sẵn. Cả hai cách đều bất tiện: một cách cần người gặp trực tiếp, cách còn lại cần kênh truyền an toàn vốn chính là thứ cần bảo vệ. Năm 1976, Whitfield Diffie và Martin Hellman đề xuất cách đảo ngược bài toán: hai bên không gửi bí mật nào, chỉ gửi hai con số công khai, rồi tự suy ra cùng một kết quả.
Toàn bộ phép tính dựa trên một bài toán cực khó đảo ngược: bài toán logarit rời rạc. Cho một số nguyên nguyên tố lớn p, một phần tử sinh g, và giá trị g mũ a, việc tìm lại số mũ a là bài toán mất thời gian tăng theo cấp số nhân. Máy tính tính lũy thừa rất nhanh, nhưng đảo ngược lại thì không.

Ví dụ tính tay với số nhỏ
Hãy dùng các con số nhỏ để thấy rõ cơ chế. Chọn p bằng 23, g bằng 5. Chọn số bí mật riêng a bằng 4 của phía gửi và b bằng 3 của phía nhận.
- Phía gửi tính giá trị công khai A bằng 5 mũ 4 lấy phần dư 23, được 4.
- Phía nhận tính giá trị công khai B bằng 5 mũ 3 lấy phần dư 23, được 10.
- Hai bên trao đổi A và B qua kênh công khai.
- Phía gửi tính bí mật chung bằng 10 mũ 4 lấy phần dư 23, được 18.
- Phía nhận tính bí mật chung bằng 4 mũ 3 lấy phần dư 23, cũng được 18.
Cùng một kết quả 18, mà không bên nào cần gửi con số mũ 4 hay 3 cho bên kia. Người nghe lén chỉ thấy p bằng 23, g bằng 5, A bằng 4 và B bằng 10. Với các số lớn như vậy, người nghe lén muốn suy ra 18 thì phải giải bài toán logarit rời rạc, tức tìm số mũ sao cho 5 mũ số mũ lấy phần dư 23 cho ra 10. Với số nhỏ như 23 thì dễ, nhưng khi p có hàng nghìn chữ số nhị phân thì phép tính đó không còn khả thi.
Vì sao thuật toán thô không đủ an toàn
Nghe lén thì bất lực, nhưng kẻ tấn công có thể chèn mình vào giữa. Giả sử kẻ tấn công chặn A và B, rồi tự chọn số riêng của hắn là c. Hắn gửi cho mỗi bên một giá trị công khai do hắn tính, đồng thời giữ lại giá trị thật từ phía mỗi bên. Kết quả là hắn biết hai bí mật chung, trong khi hai bên nghĩ rằng chỉ mình họ làm người duy nhất biết. Đây chính là tấn công kẽ giữa, và nó là điểm yếu cố hữu của bản Diffie-Hellman nguyên thuỷ.
Cách sửa là bổ sung xác thực danh tính: mỗi bên ký bằng khoá riêng của mình, và gắn chữ ký vào bản báo điệu. Giao thức Station to Station là ví dụ kinh điển, bổ sung xác thực hai chiều và không cần dấu thời gian. Khi bản gốc không có xác thực, nó chỉ an toàn khi bên thứ ba thực sự không chèn vào được, tức là mô hình kênh bảo mật một phần.
Khóa tạm thời và tính bảo mật tiến
Một cải tiến quan trọng là sinh khóa riêng tư mới cho mỗi phiên làm việc, dùng xong thì xoá ngay. Nhờ vậy, kể cả khi khoá dài hạn của máy chủ bị lộ sau này, các phiên đã hoàn tất vẫn không bị giải mã, vì bí mật của chúng chỉ tồn tại trong bộ nhớ một thời gian ngắn. Đây là tính chất bảo mật tiến, và thuật toán đã dùng trong hầu hết các phiên TLS 1.3 hiện nay.
Giao thức X3DH của Signal cụ thể hoá cách này: mỗi người dùng công bố một cặp khóa danh tính, một cặp khóa tiền ký, và một danh sách khóa dùng một lần. Khi Alice gửi tin, bà sinh một cặp khóa tạm thời, dùng khóa tạm thời đó với khóa của Bob để tạo ra bí mật dùng một lần, rồi xoá khóa tạm thời. Nhờ vậy người gửi có tính không thể chối bỏ, và tính bảo mật tiến ngay cả khi điện thoại của Bob sau này bị mở khóa và lấy dữ liệu.
Diffie-Hellman trường hữu hạn và phiên bản đường cong elip
Bản gốc dùng số nguyên lớn theo phép chia phần dư, và tập các số nguyên nguyên tố dùng chung thường được đặt tên theo chuẩn RFC 3526, gồm các nhóm 1536, 2048, 3072, 4096, 6144 và 8192 bit. Theo ước lượng trong chính tài liệu này, nhóm 3072 bit tương đương sức mạnh bảo mật khoảng 130 đến 210 bit, và phần tử sinh luôn được cố định là 2. Nói cách khác, khóa công khai phải dài hơn nhiều so với khóa đối xứng dùng sau đó, vì việc tìm số mũ tốn kém hơn nhiều.
Ngành sau đó chuyển sang phiên bản đường cong elip, viết tắt là ECDH. Bản RFC 7748 chuẩn hoá đường cong 25519 và hàm trao đổi X25519 trên trường số nguyên dạng Montgomery. Ở đây mỗi bên chỉ cần khóa 32 byte, tức 256 bit, và tài liệu chuẩn còn nêu rõ mức an toàn chỉ dưới 128 bit một chút. Bảng tương đương trong NIST cho thấy cùng mức an toàn 128 bit có thể đạt bằng khóa cong elip 256 đến 383 bit, trong khi trường hữu hạn phải dùng khóa 3072 bit.
| Đặc điểm | Trường hữu hạn | Đường cong elip |
|---|---|---|
| Độ dài khóa cho mức an toàn 128 bit | 3072 bit | 256 đến 383 bit |
| Bài toán khó | logarit rời rạc | logarit rời rạc trên đường cong |
| Chuẩn tham chiếu | RFC 3526 | RFC 7748 |
| Kích thước tính toán | Nặng hơn | Nhẹ hơn nhiều, thích hợp máy di động |

Ứng dụng thực tế
Trong TLS 1.3, mọi bắt tay đều dùng trao đổi khóa Diffie-Hellman dạng tạm thời hoặc dạng cong elip, và các thuật toán trao đổi khóa bằng khóa đối xứng kiểu cũ đã bị loại bỏ hoàn toàn. Với X25519, kết quả trao đổi được dùng trực tiếp qua một hàm băm suy giãn khóa, không cần bước xử lý riêng.
Trong SSH, hai bên trao đổi khóa bằng nhóm MODP 2048 bit rồi xác thực bằng chữ ký trên giá trị băm của toàn bộ quá trình, bao gồm cả khóa máy chủ. Với SSH, khóa xác thực và khóa trao đổi là hai cặp riêng biệt: cặp khóa máy chủ chỉ dùng để chứng minh danh tính, còn khóa trao đổi được sinh ra cho phiên và xoá sau khi đóng.
Tóm lại
Diffie-Hellman giải quyết bài toán tưởng chừng bất khả thi: hai bên lần đầu gặp nhau vẫn tạo được bí mật chung qua kênh công khai mà không cần giao khoá trước. Bản thô cần bổ sung xác thực để chống kẽ giữa, và khóa tạm thời sinh ra cho mỗi phiên để có tính bảo mật tiến. Ngày nay người ta gần như luôn dùng phiên bản đường cong elip vì khóa ngắn hơn nhiều lần mà sức mạnh bảo mật không giảm.
Nguồn tham khảo
- Wikipedia: Diffie-Hellman key exchange, cơ chế, ví dụ tính và tấn công kẽ giữa
- RFC 3526: các nhóm Diffie-Hellman trường hữu hạn dùng cho IKE
- RFC 7748: đường cong X25519 và X448 cho trao đổi khóa
- RFC 8446: đặc tả TLS 1.3 với trao đổi khóa tạm thời
- RFC 4253: giao thức SSH và phương thức trao đổi khóa
- Signal: đặc tả giao thức X3DH dùng khóa tạm thời
