Mạng riêng ảo bảo vệ luồng dữ liệu trên các kết nối không tin cậy bằng cách xác thực các điểm cuối và thiết lập khóa mã hóa chung. Dù các thuật toán đối xứng chịu trách nhiệm mã hóa dữ liệu truyền tải, tính bảo mật nền tảng của toàn bộ phiên kết nối phụ thuộc vào giai đoạn bắt tay trao đổi khóa ban đầu. Nếu kẻ tấn công có thể suy đoán khóa tĩnh hoặc khóa tạm thời thông qua các kênh phụ vi kiến trúc, mọi lớp bảo vệ của đường hầm mã hóa sẽ bị vô hiệu hóa.

Các giao thức truyền thống trước đây thường dựa vào đường cong elip chuẩn NIST như P-256 (secp256r1) ở dạng Weierstrass ngắn. Các đường cong thế hệ cũ này tiềm ẩn nhiều rủi ro khi triển khai: phép cộng điểm và phép nhân đôi điểm sử dụng các công thức toán học khác biệt, các nhánh rẽ điều kiện phụ thuộc trực tiếp vào từng bit của khóa bí mật, và quá trình chuyển đổi tọa độ tạo ra độ trễ thực thi biến thiên dễ bị phân tích thời gian bộ nhớ đệm (cache-timing attacks).

WireGuard giải quyết triệt để các lỗ hổng kênh phụ trong quá trình bắt tay bằng cách xây dựng toàn bộ cơ chế bất đối xứng trên đường cong Curve25519 của Daniel J. Bernstein. Thông qua cấu trúc thang Montgomery (Montgomery ladder) và các phép toán không phân nhánh, WireGuard đạt được khả năng nhân vô hướng hằng số thời gian, kháng hoàn toàn các kỹ thuật tấn công đo đạc thời gian.

Lỗ hổng kênh phụ trên các đường cong elip cổ điển

Để đánh giá ưu thế bảo mật của Curve25519, hãy xem xét cơ chế nhân vô hướng trên các đường cong dạng Weierstrass. Việc tính toán khóa công khai $Q = k \cdot P$ đòi hỏi nhân điểm cơ sở $P$ với một số nguyên vô hướng bí mật $k$.

Trong sách giáo khoa toán học, phép nhân vô hướng thường được triển khai qua thuật toán "nhân đôi và cộng" (double-and-add):

// Mã giả thuật toán double-and-add truyền thống tiềm ẩn rủi ro
Point result = INFINITY_POINT;
for (int i = 255; i >= 0; i--) {
    result = point_double(result);
    if ((secret_scalar >> i) & 1) {
        result = point_add(result, base_point); // Phân nhánh phụ thuộc vào bit bí mật
    }
}

Thiết kế này tạo ra các điểm yếu nghiêm trọng ở cấp độ phần cứng:

  1. Phân nhánh dự đoán lệnh của CPU: Lệnh rẽ nhánh if chỉ thực thi khi bit của khóa bí mật bằng 1. Một tiến trình độc hại chạy trên cùng nhân vi xử lý có thể theo dõi bộ ghi lịch sử phân nhánh của CPU hoặc đo độ trễ đường ống lệnh để bóc tách từng bit của khóa riêng tư.
  2. Dấu vết truy cập bộ nhớ đệm: Phép nhân đôi điểm và phép cộng điểm truy cập vào các vùng bộ nhớ và bảng tra cứu khác nhau. Thông qua các kỹ thuật như FLUSH+RELOAD hay PRIME+PROBE, kẻ tấn công đo thời gian nạp dòng bộ nhớ đệm để khôi phục khóa mật mã.
  3. Xử lý các trường hợp biên: Các công thức Weierstrass chứa các ngoại lệ toán học: cộng một điểm với chính nó đòi hỏi hàm nhân đôi riêng, còn cộng một điểm với điểm đối nghịch sẽ tạo ra điểm ở vô cực. Việc xử lý các ngoại lệ này bằng các điều kiện rẽ nhánh làm rò rỉ thông tin qua thời gian thực thi.

Dạng Montgomery và phép toán trên một tọa độ duy nhất

Được Daniel J. Bernstein giới thiệu năm 2006 và chuẩn hóa trong RFC 7748, Curve25519 hoạt động trên trường nguyên tố $\mathbb{F}_{2^{255}-19}$. Thay vì dùng dạng Weierstrass phức tạp, Curve25519 sử dụng phương trình dạng Montgomery:

$$y^2 = x^3 + 486662x^2 + x$$

Dạng Montgomery sở hữu một đặc tính đại số vượt trội: phép nhân vô hướng có thể được tính toán hoàn toàn chỉ dựa trên tọa độ $x$, loại bỏ hoàn toàn tọa độ $y$ trong quá trình trao đổi khóa Diffie-Hellman (gọi là X25519).

Trong X25519, các điểm được biểu diễn dưới dạng tọa độ xạ ảnh $(X : Z)$, tương ứng với tọa độ afin $x = X / Z$. Khi biết tọa độ xạ ảnh của hai điểm $P$, $Q$ và hiệu của chúng $P - Q$, tọa độ của cả $P + Q$ và $2P$ có thể được tính toán đồng thời bằng một tập hợp cố định các phép cộng, trừ, bình phương và nhân trên trường hữu hạn.

Nhờ việc không bao giờ cần tính toán hay lưu trữ tọa độ $y$, thuật toán cắt giảm một nửa khối lượng tính toán trường hữu hạn, đồng thời loại trừ hoàn toàn các đòn tấn công khai thác tính mơ hồ về dấu của tọa độ $y$.

Thang Montgomery hằng số thời gian và kỹ thuật cswap không nhánh

WireGuard thực hiện phép nhân điểm X25519 bằng thuật toán thang Montgomery. Thuật toán duy trì hai điểm xạ ảnh liên tục, $R_0$ và $R_1$, với hiệu số bất biến $R_1 - R_0 = P$ trong suốt chu trình tính toán.

Với mỗi bit của khóa vô hướng, từ bit có trọng số cao nhất đến bit thấp nhất, thang Montgomery thực hiện một phép nhân đôi điểm và một phép cộng điểm vi sai:

Vòng lặp thang Montgomery:
Nếu bit vô hướng == 0:
    R0 <- 2 * R0
    R1 <- R0 + R1
Nếu bit vô hướng == 1:
    R0 <- R0 + R1
    R1 <- 2 * R1

Thay vì thực thi quyết định này bằng câu lệnh điều kiện if, thuật toán sử dụng phép hoán đổi có điều kiện hằng số thời gian (cswap). Trước khi tính toán, $R_0$ và $R_1$ được tráo đổi vị trí nếu bit hiện tại khác với bit liền trước.

// Phép hoán đổi hằng số thời gian không dùng rẽ nhánh hay bảng tra cứu
static void cswap(uint32_t swap, fe x1, fe x2) {
    uint32_t mask = 0 - swap; // 0x00000000 nếu swap == 0, 0xFFFFFFFF nếu swap == 1
    for (int i = 0; i < 10; i++) {
        uint32_t diff = mask & (x1[i] ^ x2[i]);
        x1[i] ^= diff;
        x2[i] ^= diff;
    }
}

Quá trình tính toán diễn ra đồng nhất tuyệt đối:

  • Chuỗi lệnh đồng nhất: Bất kể bit bí mật là 0 hay 1, vi xử lý đều thực thi đúng một chuỗi lệnh máy giống hệt nhau: 4 phép bình phương, 5 phép nhân và 8 phép cộng/trừ modulo.
  • Không dùng bảng tra cứu bộ nhớ: Không có bất kỳ bảng dữ liệu nào được truy xuất trong bộ nhớ, tước bỏ mọi tín hiệu đo đạc của kẻ tấn công bộ nhớ đệm.
  • Mặt nạ bitwise không phân nhánh: Logic cswap chỉ dựa trên các phép toán nhị phân XOR và AND. Bộ xử lý hoàn thành lệnh với số chu kỳ xung nhịp cố định, không chịu ảnh hưởng từ cơ chế phán đoán rẽ nhánh của phần cứng.

Kẹp khóa vô hướng và khả năng kháng nhóm con nhỏ

Trong mật mã đường cong elip, kẻ tấn công có thể cố tình gửi khóa công khai thuộc về một nhóm con có bậc rất nhỏ. Nếu máy chủ tính toán bí mật chung với một điểm bậc thấp, giá trị khóa thu được chỉ rơi vào một tập hợp rất hạn chế, giúp kẻ tấn công suy đoán được khóa riêng tư.

Đường cong Curve25519 có bậc bằng $8 \times p_{25519}$, trong đó $p_{25519}$ là một số nguyên tố lớn 252-bit, nghĩa là đường cong có thừa số phụ (cofactor) $h = 8$. Ngoài ra, đường cong xoắn bậc hai (quadratic twist) của nó có bậc $4 \times p'_{25519}$ (thừa số phụ 4).

WireGuard triệt tiêu hoàn toàn nguy cơ tấn công nhóm con bằng thao tác kẹp khóa vô hướng (scalar clamping). Trước khi nhân vô hướng, khóa bí mật 32-byte $k$ được biến đổi qua các mặt nạ nhị phân:

// Cơ chế kẹp khóa theo chuẩn RFC 7748
k[0]  &= 248; // Xóa 3 bit thấp nhất (bit 0, 1, 2)
k[31] &= 127; // Xóa bit 255
k[31] |= 64;  // Bật bit 254

Thao tác kẹp mang lại ba lợi ích phòng thủ cốt lõi:

  1. Triệt tiêu thừa số phụ: Việc xóa 3 bit thấp nhất buộc $k$ phải là bội số của 8. Mọi thành phần thuộc nhóm con bậc 8 sẽ bị triệt tiêu về điểm ở vô cực, loại bỏ hoàn toàn đòn tấn công giam giữ nhóm con nhỏ.
  2. An toàn xoắn (Twist Security): Curve25519 đạt chuẩn an toàn xoắn. Ngay cả khi kẻ tấn công gửi tọa độ nằm trên đường xoắn bậc hai thay vì trên chính đường cong, thừa số phụ 4 của đường xoắn cũng bị triệt tiêu bởi số nhân là bội số của 8, ngăn chặn các cuộc tấn công đường cong không hợp lệ mà không cần tốn chi phí kiểm tra điểm hợp lệ.
  3. Cố định độ dài bit: Việc xóa bit 255 và bật bit 254 bảo đảm khóa vô hướng luôn có chiều dài chính xác 255 bit với bit đầu tiên luôn là 1, ngăn ngừa hiện tượng rò rỉ thời gian do vòng lặp có độ dài biến thiên.

Tích hợp trong nhân Linux và tăng tốc bằng tập lệnh SIMD

Bên trong nhân Linux, động cơ Curve25519 của WireGuard được tích hợp trực tiếp vào hệ thống con mật mã (lib/crypto/curve25519-fiat32.c và các tệp hợp ngữ tối ưu riêng cho kiến trúc CPU).

Các phép tính số học trên trường $\mathbb{F}_{2^{255}-19}$ đòi hỏi nhân các số nguyên 256-bit. Trên nền tảng 64-bit, các số nguyên được chia thành mảng gồm 5 phần tử (radix-$2^{51}$), giúp bộ nhân phần cứng 64-bit tính toán tích mà không bị tràn số nhớ trung gian.

Mô hình biểu diễn mảng 5 phần tử cơ số 2^51:
[ Phần tử 0: 51 bit ] [ Phần tử 1: 51 bit ] [ Phần tử 2: 51 bit ] [ Phần tử 3: 51 bit ] [ Phần tử 4: 51 bit ]

Trên các vi xử lý x86_64 hiện đại, các đoạn mã hợp ngữ viết tay (curve25519-x86_64.S) tận dụng triệt để các tập lệnh mở rộng AVX2 và AVX-512. Các tập lệnh SIMD này tính toán song song nhiều phép nhân thành phần, hoàn tất một phép nhân vô hướng 255-bit chỉ trong chưa đầy 45.000 chu kỳ CPU—tương đương dưới 15 micro giây cho mỗi lượt bắt tay Diffie-Hellman. Do các tập lệnh vectơ hóa này vận hành với độ trễ cố định trên vi kiến trúc hiện đại, hiệu năng được nâng cao tối đa mà không đánh đổi tính kháng kênh phụ.

Cơ chế bảo mật và xóa sạch bộ nhớ trong RiceGuard

Tại các cổng mạng dịch vụ quy mô lớn, việc phòng vệ kênh phụ không chỉ dừng lại ở lệnh máy mà cần bao quát toàn bộ vòng đời lưu trữ khóa trong bộ nhớ RAM.

RiceGuard bổ sung các lớp bảo vệ chuyên sâu:

  1. Xóa sạch bộ nhớ nhạy cảm: Ngay sau khi tính toán bí mật chung Diffie-Hellman tạm thời, các bộ đệm chứa khóa được xóa sạch khỏi bộ nhớ RAM bằng các hàm chuyên dụng memzero_explicit và memset_sensitive. Thao tác này ngăn trình biên dịch loại bỏ lệnh xóa khi tối ưu hóa mã nguồn, chặn đứng nguy cơ trích xuất khóa từ các bản sao lưu bộ nhớ hoặc kênh phụ suy đoán.
  2. So sánh dữ liệu hằng số thời gian: Việc xác thực mã định danh và kiểm tra khóa công khai được thực hiện bằng các hàm so sánh bộ nhớ hằng số thời gian (crypto_memneq), ngăn chặn hành vi dò tìm khóa theo từng byte qua độ trễ phản hồi.
  3. Đổi khóa tự động định kỳ: RiceGuard kích hoạt phiên xoay vòng khóa Noise mỗi 120 giây hoặc sau $2^{20}$ gói tin, bảo đảm tính bí mật chuyển tiếp hoàn hảo và thu hẹp tối đa phạm vi ảnh hưởng nếu một khóa tạm thời bị đe dọa.

Sự kết hợp giữa vẻ đẹp toán học của Curve25519, tính tất định của thang Montgomery và kỷ luật quản lý bộ nhớ tạo nên một nền tảng mật mã vững chắc cho hạ tầng mạng hiện đại.

Tải VPNRice