Là một dạng mật mã hóa cho phép ngƣời sử dụng trao đổi các thông tin mật mà không cần phải trao đổi các khóa chung bí mật trƣớc đó. Điều này đƣợc thực hiện bằng cách sử dụng một cặp khóa có quan hệ toán học với nhau là khóa công khai và khóa cá nhân (hay khóa bí mật).
Thuật toán mật mã hóa khóa công khai đƣợc thiết kế đầu tiên[4] bởi James H. Ellis, Clifford Cocks, và Malcolm Williamson tại GCHQ(Anh) vào đầu thập kỷ 1970. Thuật toán sau này đƣợc phát triển và biết đến dƣới tên Diffie-Hellman, và là một trƣờng hợp đặc biệt của RSA. Tuy nhiên những thông tin này chỉ đƣợc tiết lộ vào năm 1997. Trong các hệ mã hoá công khai có rất nhiều thuật toán sau :
Một số thuật toán mã hóa khóa công khai đƣợc đánh giá cao:
Trao đổi khóa Diffie-Hellman; ElGamal; Thuật toán mã hóa RSA (PKCS), DSS (Tiêu chuẩn chữ ký số); Các kỹ thuật mã hóa đƣờng cong elliptic; Các kỹ thuật thỏa thuật khóa chứng thực bằng mật khẩu; Hệ thống mật mã Paillier
Một số thuật toán không đƣợc đánh giá cao: Merkle-Hellman (sử dụng bài toán cái balô)
Tuy nhiên trong luận văn này chỉ đề cập một số thuật toán đƣợc đánh giá cao thƣờng sử dụng trong bảo mật thƣ điện tử nhƣ «Trao đổi khóa Diffie-Hellman, Thuật toán mã hóa RSA (PKCS), ElGamal».
27
D-H là một phƣơng pháp trao đổi khóa đƣợc phát minh sớm nhất trong mật mã học. Phƣơng pháp trao đổi khóa D-H cho phép hai bên (ngƣời, thực thể giao tiếp) thiết lập một khóa bí mật chung để mã hóa dữ liệu sử dụng trên kênh truyền thông không an toàn mà không cần có sự thỏa thuận trƣớc về khóa bí mật giữa hai bên. Khóa bí mật tạo ra sẽ đƣợc sử dụng để mã hóa dữ liệu với phƣơng pháp mã hóa khóa đối xứng.
Giao thức này đƣợc công bố đầu tiên bởi Whitfield Diffie và Martin Hellman vào năm 1976 và đƣợc cấp bằng sáng chế Hoa Kỳ số 4.200.770 mô tả thuật toán này từ năm 1977 ghi nhận Hellman, Diffie, và Merkle [19] là tác giả phát minh, dù rằng trƣớc đó vài năm nó đã đƣợc phát minh một cách độc lập trong GCHQ, cơ quan tình báo Anh, bởi James H. Ellis, Clifford Cocks và Malcolm J. Williamson nhƣng đƣợc giữ bí mật. Năm 2002, Hellman đề xuất thuật toán nên đƣợc gọi là trao đổi khóa Diffie–Hellman–Merkle để ghi nhận sự đóng góp của Ralph Merkle trong phát minh lĩnh vực mật mã hóa khóa công khai (Hellman, 2002).
Mặc dù giao thức trao đổi khóa Diffie–Hellman bản thân nó là giao thức trao đổi khóa ẩn danh (không xác thực), nó đã đƣa ra một nền tảng cơ sở cho nhiều loại giao thức xác thực và đƣợc sử dụng để tạo nên bí mật chuyển tiếp hoàn hảo trong chế độ ngắn hạn của giao thức Transport Layer Security (EDH hoặc DHE tùy theo bộ mã hóa). Phƣơng pháp này đƣợc áp dụng sau đó cho thuật toán RSA.
Mô tả giao thức: Sau đây là mô tả khái quát của giao thức. Thiết lập khóa:
Bƣớc 1: Alice và Bob thỏa thuận sử dụng chung một nhóm cyclic hữu hạn G và một phần tử sinh g của G. Phần tử sinh g công khai với tất cả mọi ngƣời, kể cả kẻ tấn công. Dƣới đây chúng ta giả sử nhóm G là nhóm nhân.
Bƣớc 2: Alice chọn một số tự nhiên ngẫu nhiên a và gửi ga mod p cho Bob. Bƣớc 3: Bob chọn một số tự nhiên ngẫu nhiên b và gửi gb mod p cho Alice. Bƣớc 4: Alice tính (gb)a mod p.
28
Vì giá trị (gb)a và (ga)b là bằng nhau (do nhóm G có tính kết hợp), cả Alice và Bob đều tính đƣợc giá trị gab và có thể sử dụng nó cho khóa bí mật chung.
Mã hóa:
Thông điệp m trƣớc khi đƣợc gửi đi bởi Alice (hoặc Bob) sẽ đƣợc mã hóa thành mgab.
Giải mã:
Để giải mã thông điệp m, gửi dƣới dạng mgab, Bob (hoặc Alice) phải tính đƣợc giá trị (gab
)-1. Giá trị (gab
)-1 đƣợc tính nhƣ sau: Vì Bob biết |G|, b, và ga, mặt khác theo định lý Lagrange trong lý thuyết nhóm ta có x|G| = 1 với mọi x thuộc G, nên Bob tính đƣợc (ga
)|G|-b = ga(|G|-b) = ga|G|-ab = ga|G|g-ab = (g|G|)ag-ab=1ag-ab=g-ab=(gab)-1. Việc giải mã bây giờ trở nên dễ dàng: Bob sử dụng (gab)-1 để tính và phục hồi thông điệp nguyên thủy bằng cách tính: mgab(gab)-1 = m(1) = m.
b) Hệ mật RSA:
Ý tƣởng về một hệ mật khoá công khai đã đƣợc Diffie và Hellman đƣa ra vào 1976. Còn việc hiện thực hóa hệ mật khoá công khai thì do Rivest, Shamir và Adleman đƣa ra đầu tiên vào 1977 tại MIT, họ đã tạo nên hệ mật RSA [16] nổi tiếng.
Hệ mật này sử dụng các tính toán trong Zn, trong đó n là tích của 2 số nguyên tố phân biệt p và q. Ta có thể mô tả hệ mật RSA các bƣớc thực hiện nhƣ sau:
Sinh khóa
Bƣớc 1: Tạo ra một cặp số nguyên tố lớn, ngẫu nhiên p và q. (p≠q) Bƣớc 2: Tính N = pq.
Bƣớc 3: Chọn một mũ công khai lẻ e nằm giữa 3 và n-1 cùng nguyên tố với p - 1 và q – 1: φ(n)=(p-1)*(q-1)
Bƣớc 4: Tính toán số mũ riêng d từ e, p và q sao cho 1<e< φ(n)
Bƣớc 5: Đầu ra (n,e) là khóa công khai và (n,d) là khóa riêng: de1(mod φ(n)) Một dạng khác của khóa bí mật bao gồm:
p and q, hai số nguyên tố chọn ban đầu,
29
(1/q) mod p (thƣờng đƣợc gọi là iqmp)
Dạng này cho phép thực hiện giải mã và ký nhanh hơn với việc sử dụng định lý số dƣ Trung Quốc(CRT). Ở dạng này, tất cả thành phần của khóa bí mật phải đƣợc giữ bí mật.
Bob gửi khóa công khai cho Alice, và giữ bí mật khóa cá nhân của mình. Ở đây, p và q giữ vai trò rất quan trọng. Chúng là các nhân tố của n và cho phép tính d khi biết e. Nếu không sử dụng dạng sau của khóa bí mật (dạng CRT) thì p và q sẽ đƣợc xóa ngay sau khi thực hiện xong quá trình tạo khóa.
Mã hoá:
Việc mã hóa thực hiện theo công thức:
- Theo phƣơng án 1 (mã hóa bảo mật): cE m( )memodn [16] - Theo phƣơng án 2 (mã hóa chứng thực): cE m( )md modn [16] Giải mã:
Việc giải mã thực hiện theo công thức:
- Theo phƣơng án 1 (mã hóa bảo mật): mD c( )cdmodn[16] - Theo phƣơng án 2 (mã hóa chứng thực): mD c( )cemodn [16] Bản rõ M có kích thƣớc i-1 bít, bản mã C có kích thƣớc i bít.
Ví dụ:
Sau đây là một ví dụ với những số cụ thể. Ở đây chúng ta sử dụng những số nhỏ để tiện tính toán còn trong thực tế phải dùng các số có giá trị đủ lớn.
Bƣớc 1: Tạo ra một cặp số nguyên tố lớn, ngẫu nhiên p và q
P = 61 — số nguyên tố thứ nhất (giữ bí mật hoặc hủy sau khi tạo khóa ) q = 53 — số nguyên tố thứ hai (giữ bí mật hoặc hủy sau khi tạo khóa) Bƣớc 2: Tính: n = pq = = 61*53=3233 — môđun (công bố công khai) Bƣớc 3: φ(n)=(p-1)*(q-1) = (61-1)*(53-1)=3120 Bƣớc 4: Chọn e = 17 vì ƢCLN(17,3120) = 1 Bƣớc 5: Tính d x* 1 e => 17d=1+3120x e = 17 — số mũ công khai
30
d = 2753 — số mũ bí mật
Khóa công khai là cặp (e, n). Khóa bí mật là d. Hàm mã hóa là: encrypt(m) = me mod n = m17 mod 3233
với m là văn bản rõ. Hàm giải mã là:
decrypt(c) = cd mod n = c2753 mod 3233 với c là văn bản mã.
Để mã hóa văn bản có giá trị 123, ta thực hiện phép tính: encrypt(123) = 12317 mod 3233 = 855
Để giải mã văn bản có giá trị 855, ta thực hiện phép tính: decrypt(855) = 8552753 mod 3233 = 123
Với hệ mật RSA đƣợc trình bày ở trên ta thấy cách tấn công dễ thấy nhất đối với hệ mật này là thám mã cố gắng phân tích n ra các thừa số nguyên tố. Nếu thực hiện đƣợc phép phân tích này thì có thể dễ dàng tính đƣợc (n)=(p-1)(q-1) và rồi tính số mũ a và b đúng nhƣ ví dụ trên đã làm. Vì thế để hệ RSA đƣợc coi là mật thì nhất thiết n=pq phải là một số đủ lớn để việc phân tích nó sẽ không có khả năng về mặt tính toán.
c) Hệ mật Elgamzzal:
Hệ mật Elgamal là một hệ mật mã công khai dựa trên bài toán logarithm rời rạc do ông Teher Elgamal ngƣời ai cập đề xuất năm 1984 [18]. Nó là một hệ mật không tất định vì bản mã phụ thuộc vào cả bản rõ x lẫn giá trị ngẫu nhiên k do ngƣời gửi chọn. Bởi vậy sẽ có nhiều bản mã đƣợc mã từ cùng bản rõ.
Bài toán logarithm rời rạc trong Zp:
Đặc trƣng của bài toán: I = (p,,) trong đó p là số nguyên tố Zp là phần tử nguyên thuỷ, Zp*
Mục tiêu: hãy tìm một số nguyên duy nhất a, 0 a p-2 sao cho a (mod p) Ta sẽ xác định số nguyên a bằng log.
Hệ mật khoá công khai Elgamal trong Zp*:
Cho p là số nguyên tố sao cho bài toán logarithm rời rạc trong Zp là khó giải. cho Zp* là phần tử nguyên thuỷ. Giả sử P=Zp*, C= Zp* x Zp*. [18] Ta định nghĩa:
31 K=(p, ,a, ): a
(mod p)[18] Các giá trị p, , đƣợc công khai, còn a giữ kín
Với K=(p, ,a, ) và một số ngẫu nhiên bí mật k Zp-1 ta xác định: ek(x,k)=(y1,y2) [18] Trong đó y1 = k mod p [18] y2 = xk mod p [18] Với y1, y2 Zp* ta xác định: dk(y1,y2) = y2(y1a)-1 mod p [18]
Ví dụ: Cho p=2579, =2, a=765. Khi đó =2765 mod 2579 = 949
Bây giờ giả sử ngƣời gửi muốn gửi thông báo x=1299 tới ngƣời nhận. Giả sử số ngẫu nhiên k mà ngƣời gửi chọn là k=853. Sau đó ngƣời gửi tính:
y1 = 2853 mod 2579 = 435
y2 = 1299 x 949853 mod 2579 = 2396
Khi ngƣời nhận thu đƣợc bản mã y = (435, 2396), ngƣời nhận tính x = 2396 x (435765)-1 mod 2579 = 1299
Đây chính là bản rõ mà ngƣời gửi đã mã hoá.