Mật mã hóa khóa công khai hoạt động như thế nào
Một hướng dẫn thực tế về mã hóa không đối xứng, các cặp khóa và chữ ký số, mà không có những phép loại suy toán học tay vấy vơ.
Mỗi khi bạn SSH vào một máy chủ hoặc tải một trang HTTPS, hai khóa được liên kết toán học đặc biệt đó thực hiện phần nặng. Một là công khai, một là riêng tư, và mối quan hệ giữa chúng là những gì làm cho giao tiếp an toàn trên một mạng không đáng tin cậy có thể thực hiện được.
Ý tưởng cơ bản
Với mã hóa đối xứng, một khóa vừa khóa vừa mở khóa dữ liệu. Điều đó hoạt động tốt nếu cả hai bên đã chia sẻ một bí mật, nhưng phân phối bí mật đó một cách an toàn là phần khó. Mật mã hóa khóa công khai (không đối xứng) giải quyết vấn đề này bằng cách tạo ra một cặp có liên quan toán học: một khóa công khai bạn đưa cho bất kỳ ai, và một khóa riêng tư bạn không bao giờ chia sẻ.
Dữ liệu được mã hóa bằng khóa công khai chỉ có thể được giải mã bằng khóa riêng tư phù hợp. Dữ liệu được ký bằng khóa riêng tư có thể được xác minh bởi bất kỳ ai sở hữu khóa công khai. Hai tính chất đó bao gồm gần như tất cả những gì chúng ta sử dụng nó cho: bảo mật và xác thực.
RSA, ví dụ điển hình
RSA dựa vào thực tế là nhân hai số nguyên tố lớn là nhanh, nhưng phân tích tích đó trở lại những số nguyên tố đó là vô cùng nặng nề về tính toán ở quy mô lớn. Một khóa RSA 2048-bit được xây dựng từ hai số nguyên tố khoảng 1024 bit mỗi cái. Khóa công khai là (n, e) — n là tích của các số nguyên tố, e là một số mũ cố định như 65537. Khóa riêng tư được lấy bằng cách sử dụng hàm Euler của n và liên quan đến việc biết các số nguyên tố ban đầu.
Mã hóa là phép lũy thừa mô-dul: c = m^e mod n. Giải mã đảo ngược nó với số mũ riêng tư d: m = c^d mod n. Không ai thực sự đang mã hóa các tải trọng lớn trực tiếp bằng RSA trong thực tế — nó chậm và có giới hạn kích thước được liên kết với độ dài khóa. Thay vào đó, RSA thường bao bọc một khóa phiên đối xứng (AES-256, ví dụ), và mật mã đối xứng xử lý dữ liệu hàng loạt. Đó là cách tiếp cận hybrid mà TLS sử dụng.
Mật mã hóa đường cong Elliptic và lý do nó đang thay thế
ECC cung cấp cho bạn bảo mật tương đương với RSA nhưng với khóa nhỏ hơn nhiều. Một khóa ECC 256-bit (như curve secp256r1 hoặc Curve25519) có cường độ khoảng tương đương với khóa RSA 3072-bit. Khóa nhỏ hơn có nghĩa là handshake nhanh hơn và ít băng thông hơn, đó là lý do tại sao các cấu hình TLS hiện đại, triển khai SSH và giao thức Signal của chúng tôi đều dựa vào ECC.
Toán học là khác — nó dựa trên bài toán logarit rời rạc trên các điểm trên một đường cong elliptic thay vì phân tích thừa số nguyên — nhưng mối quan hệ khóa công khai/riêng tư và những đảm bảo là về mặt khái niệm là giống nhau.
Chữ ký số: nửa kia của phương trình
Mã hóa giữ dữ liệu bảo mật. Chữ ký chứng minh tính xác thực và tính toàn vẹn. Để ký một tin nhắn, bạn hash nó (SHA-256, thông thường) và mã hóa hash đó bằng khóa riêng tư của bạn. Bất kỳ ai có khóa công khai của bạn đều có thể hash tin nhắn chính họ, giải mã chữ ký của bạn và kiểm tra hai hash có khớp không.
Đây chính xác là những gì xảy ra khi bạn chạy git commit -S với khóa GPG, hoặc khi Cơ quan Cấp chứng chỉ ký chứng chỉ TLS của bạn. Khóa riêng tư của CA ký chứng chỉ của bạn; các trình duyệt được cung cấp kèm với khóa công khai của CA được tin cậy trước, vì vậy chúng có thể xác minh tính xác thực của chứng chỉ của bạn mà không cần bao giờ nói chuyện trực tiếp với CA.
Nơi điều này xuất hiện hàng ngày
Xác thực khóa SSH là một ứng dụng trực tiếp: ssh-keygen -t ed25519 tạo một cặp khóa, bạn thả nửa công khai vào ~/.ssh/authorized_keys trên máy chủ, và xác thực xảy ra thông qua một thách thức-phản hồi sử dụng khóa riêng tư, không có mật khẩu nào được truyền.
TLS handshake sử dụng mã hóa không đối xứng trong thời gian ngắn, chỉ để thiết lập một khóa đối xứng chia sẻ (thông qua trao đổi khóa ECDHE trong các thiết lập hiện đại), sau đó đi vào mã hóa đối xứng nhanh cho phiên thực tế. Mã hóa email PGP/GPG tuân theo mô hình hybrid — mã hóa tin nhắn bằng khóa AES ngẫu nhiên, sau đó mã hóa khóa AES đó bằng khóa công khai RSA hoặc ECC của người nhận.
Cái gì thực sự bị hỏng trong thực tế
Toán học đằng sau RSA và ECC chưa bị phá vỡ thông qua tính toán cổ điển. Những gì xảy ra sai là gần như luôn là triển khai: tạo số ngẫu nhiên yếu khi tạo khóa (lỗi Debian OpenSSL từ 2008 là trường hợp giáo khoa), nonce được sử dụng lại trong chữ ký ECDSA rò rỉ khóa riêng tư, hoặc tấn công oracle padding chống lại RSA được triển khai kém (tấn công Bleichenbacher chống lại padding PKCS#1 v1.5). Tính toán lượng tử là mối đe dọa lý thuyết dài hạn — thuật toán Shor sẽ phá vỡ cả RSA và ECC nếu một máy tính lượng tử đủ lớn tồn tại — đó là lý do tại sao NIST đã tiêu chuẩn hóa các thuật toán hậu lượng tử như ML-KEM (trước đây là Kyber) để di chuyển trong tương lai.
Nếu bạn muốn đi sâu hơn về điều này, khóa mật mã hóa của Korra Studio bao gồm các giao thức trao đổi khóa và nội dung hàm hash chi tiết hơn, và các phân đoạn mạng hướng dẫn cách tất cả điều này phù hợp với một TLS handshake thực tế theo từng byte.
Viết với hỗ trợ của AI, được xem xét và đăng bởi Michal Pilch (CISSP), Korra Studio.
Đây là một ghi chép từ cơ sở kiến thức Korra Studio — nền tảng kết hợp mỗi chủ đề với phiên hỗ trợ 1-kèm-1.
Bắt đầu miễn phíarrow_forward