Cả hai tên đều là cấu trúc AEAD, cả hai đã được chuẩn hóa, và trên một máy chủ x86 hiện nay, bất kỳ cái nào cũng sẽ lấp đầy một liên kết gigabit mà không cần nỗ lực đáng kể. Lựa chọn ngừng tùy tiện khi bạn rời khỏi máy chủ đó: router giá rẻ, điện thoại cũ và thiết bị ảo thường không có tăng tốc AES, và ở đó khác biệt rất lớn. Vì vậy so sánh không phải là mật mã nào nhanh hơn, mà là mật mã nào chạy tốt trên tập điểm cuối này, và giao thức có đưa ra lựa chọn hay không.

Cùng công việc, lõi khác nhau

Cả hai cấu trúc đều cho tính bí mật và toàn vẹn trong một lượt và xác thực dữ liệu liên quan, đó là lý do các giao thức VPN dùng chúng cho kênh dữ liệu. Khác biệt nằm bên trong: AES-GCM là mật mã khối AES ở chế độ đếm với bộ xác thực đa thức trên GF(2^128), còn ChaCha20-Poly1305 là mật mã dòng với khóa 256 bit và bộ xác thực dùng một lần riêng.

Điều quan trọng trong vận hành là chung: cả hai đều thất bại thảm khốc khi dùng lại nonce, cả hai đều cần quản lý không gian nonce cho mỗi khóa, và không cái nào sửa được một đối tác xác thực sai thứ. Một hồ sơ ghi AES-256-GCM không an toàn hơn hồ sơ ghi CHACHA20-POLY1305; cả hai đều mạnh khi triển khai đúng.

Nơi AES-GCM thắng

AES có lệnh chuyên dụng trên hầu hết CPU hiện đại: AES-NI trên x86, phần mở rộng mật mã trên ARMv8 và tương đương trên các thiết kế POWER và RISC-V gần đây. Khi có chúng, GCM chạy nhiều khối song song mỗi lớp chu kỳ và việc triển khai phần mềm trở nên không đáng kể. Đây là trường hợp phổ biến với máy chủ, máy tính để bàn và điện thoại hiện nay, và đó là lý do lời khuyên dùng AES là mặc định hợp lý trong trung tâm dữ liệu.

Vấn đề là trường hợp bậc hai. Không có lệnh chuyên dụng, AES trong phần mềm chậm, và các triển khai phần mềm dựa trên bảng là những cái có lịch sử dài về vấn đề thời gian cache. Một bộ tập trung VPN trong máy ảo mà máy chủ không hiển thị cờ AES cho khách chính là trường hợp này, và dễ bị bỏ qua vì CPU của máy chủ có tính năng đó.

Hãy kiểm tra những gì tiến trình thực sự thấy, không phải những gì CPU hỗ trợ: grep -o aes /proc/cpuinfo | head -1 trên Linux, hoặc cờ tính năng tương đương trong mô hình CPU của hypervisor.

Nơi ChaCha20-Poly1305 thắng

ChaCha20 nhanh trong phần mềm di động vì chỉ dùng phép cộng, phép quay và XOR, và các triển khai của nó theo thiết kế tránh tra bảng phụ thuộc bí mật. Trên thiết bị không có tăng tốc AES, đó là lợi thế thực chất, và đó là lý do WireGuard chọn nó: mô tả giao thức WireGuard liệt kê ChaCha20-Poly1305 là mật mã dữ liệu không có thay thế.

Lựa chọn duy nhất đó nói lên điều hữu ích: trên phần cứng có tăng tốc AES, WireGuard nhường một phần thông lượng so với AES-GCM, và các tác giả đã chấp nhận điều đó để đổi lấy hành vi dự đoán được trên điện thoại, router gia đình và máy chủ container. Nếu đội hình của bạn chủ yếu là hộp ARM nhỏ, sự đánh đổi đó có lợi cho bạn.

Trường hợp ngược lại là một bộ tập trung x86 bận rộn, nơi AES-GCM với AES-NI là đường nhanh hơn và được hỗ trợ tốt hơn, và nơi ChaCha20 tốn CPU đo được mỗi gigabit. Không cấu trúc nào là điểm yếu; câu hỏi là cái nào phần cứng của bạn thực thi rẻ hơn.

Giao thức của bạn thực sự cho bạn chọn gì

ProtocolWhat you get
WireGuardChaCha20-Poly1305 only; no negotiation
OpenVPN 2.5 and laterData channel negotiated from data-ciphers: AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305
IPsec / IKEv2AES-GCM as a combined-mode transform, or ChaCha20-Poly1305 where both peers implement it
OpenVPN control channelTLS decides; TLS 1.3 offers AES-GCM and ChaCha20-Poly1305 suites

Chú ý sự tách biệt trong OpenVPN: kênh điều khiển và kênh dữ liệu được thương lượng riêng, vì vậy bộ giao thức bạn thấy cho TLS không nói gì về mật mã bảo vệ tải trọng của bạn. Bản tóm tắt phiên báo cáo cả hai, và chỉ đọc một trong hai là nguồn nhầm lẫn phổ biến.

Trong OpenVPN, mật mã của kênh dữ liệu đến từ danh sách data-ciphers ở cả hai đầu. Nếu danh sách của máy chủ và của máy khách không giao nhau, kết nối hoặc quay về những gì data-ciphers-fallback cho phép hoặc thất bại hoàn toàn, và thất bại đó thường bị đổ lỗi cho tầng sai. Đặt cùng một danh sách ở cả hai bên, sau đó xác nhận kết quả đã thương lượng trong nhật ký thay vì giả định rằng thứ tự danh sách được tôn trọng.

Quyết định từ ba sự thật về triển khai

Thứ nhất, các điểm cuối có tăng tốc AES không? Nếu mọi đối tác đều có, AES-GCM là lựa chọn rẻ hơn và là mặc định trong hầu hết cấu hình được duy trì. Nếu một phần đáng kể là router nhỏ hoặc điện thoại cũ, ChaCha20-Poly1305 giữ cho phần đuôi của đội hình không trở thành giới hạn dung lượng.

Thứ hai, giao thức có đưa ra lựa chọn không? Với WireGuard, quyết định đã được đưa ra thay bạn, và công việc hữu ích là xác minh rằng các công cụ xung quanh không âm thầm thay thế thứ khác. Với OpenVPN và IPsec, câu trả lời là một dòng cấu hình và một kết quả đã thương lượng cần ghi lại.

Thứ ba, hai đầu có thể đồng ý không? Một mật mã mà một đối tác không triển khai không phải là quyết định hiệu năng, đó là gián đoạn. Vì vậy danh sách đối tác quan trọng hơn bất kỳ điểm chuẩn nào: một đội hình hỗn hợp cần giao của các khả năng, không phải sở thích của cỗ máy nhanh nhất.

Nếu bạn đo, hãy giữ thiết bị, điểm cuối và tải giống hệt nhau và chỉ thay đổi một thứ. Một thử nghiệm so sánh hai máy chủ ở các khu vực khác nhau đo tuyến đường, không phải mật mã, và một phép đo trên máy tính xách tay không nói gì về máy chủ container có cờ CPU bị che. Hãy so sánh, rồi ghi lại mật mã nào thực sự được thương lượng: bản ghi đó có giá trị hơn điểm chuẩn.

Bài viết liên quan