2. Phân bố các khóa bảo mật
2.3. Trao đổi khóa Diffie_Hellman:
Nếu chúng ta không muốn sử dụng server khóa trực tuyến thì sử dụng giao thức đồng ý khóa để trao đổi các khóa bí mật:
1. U chọn aU ngẫu nhiên : 0 <= aU <= p-2 2. U tính α au mod p và gởi nó tới V 3. V chọn aV ngẫu nhiên : 0 <= aV <= p-2 4. V tính α av mod p và gởi nó tới U 5. U tính K = (α av)au mod p
V tính K = (α au)av mod p
Giao thức này rất giống sự tiền phân bố khóa Diffie_Hellman, nó chỉ khác ở chỗ aU và aV được chọn mỗi lần giao thức được chạy thay vì là cố định. Cả U và V đều đảm bảo việc làm tươi khóa bởi vì khóa phiên liên lạc phụ thuộc vào cả hai số mũ ngẫu nhiên aU và aV.
2.3.1. Giao thức trạm tới trạm (station_to _station):
fig15
Giao thức này có thể bị tấn công bởi một đối pjương chủ động W, W sẽ chặn lại đoạn tin giữa U và V và thay thế bằng đoạn tin của riêng mình:
Fig16
Ơû cuối giao thức U thiết lập khóa bí mật αau a’v với W vàV thiết lập khóa bí mật αa’u av với W. Khi U thử mã hóa đoạn tin gởi tới V, W sẽ có thể giải mã nó nhưng V thì không làm được. Tương tự khi V gởi đoạn tin tới U. Để tránh sự xâm nhập của W thì U và V nên thiết lập việc định danh lẫn nhau cùng thời điểm mà khóa đươc thiết lập. Giao thức như thế được gọi là sự đồng ý khóa có chứng thực là một dạng mô phỏng của sự trao đổi khóa Diffie_Hellman. Giao thức giả thiết một số nguyên tố p và một phần tử cơ bản α được biết một cách công khai. Mỗi user U sẽ có một sơ đồ chữ ký với giải thuật làm rỏ verU và giải
thuật ký tên sigU. TA cũng có một sơ đồ chữ ký với giải thuật làm rỏ công khai verTA. Mỗi user U có một sự chứng thực:
C(U) = (ID(U), verU, sigTA(ID(U), verU)) Với ID(U) là thông tin định danh cho U.
Giao thức station_to_station có chứng thực của Diffie, Van Oorschot và Wiener như sau: 1. U chọn một số ngẫu nhiên aU : 0 <= aU <= p-2
2. U tính αau mod p và gởi nó tới V
3. V chọn một số ngẫu nhiên aV : 0 <= aV <= p-2 4. V tính: αav mod p Và K = (αau)av mod p yV = sigV (αav, αau) và gởi (C(V), αav, yV ) tới U 5. U tính K = (αav)au mod p Và làm rỏ yV sử dụng verV, làm rỏ C(V) sử dụng verTA. 6. U tính yU = sigU (αau, αav)
Và gởi (C(U), yU ) tới V.
7. V làm rỏ yU sử dụng verU và làm rỏ C(U) sử dụng verTA không thể tính chữ ký của V trên (αa’v
, αau) bởi vì V không biết giải thuật ký tên sigV, nên W không thể thay sigV (αav, αa’u) bằng sigV (αa’v, αau). Tương tự W không thể thay sigU (αau, αa’v) bằng sigU (αa’u, αav) bởi vì W không biết giải thuật ký tên của U (sigU).
Tóm lại nhờ sử dụng chữ ký mà có thể tránh được sự tấn công của W.
- Giao thức này không cung cấp sự xác nhận khóa. Thật dễ dàng để mô tả điều đó bằng cách:
yV = eK(sigV (αav, αau)) trong bước 4 Và yU = eK (sigU (αau, αav)) trong bước 6.
2.3.2. Giao thức đồng ý khóa MTI (Matsumoto, Takashima, Imai):
- Giao thức này không yêu cầu U và V tính bất kỳ chữ ký nào. Nó là giao thức hai chuyến (pass) bởi vì có sự truyền thông hai phía giữa U và V (trong giao thức
station_to_station có 3 pass). Việc thiết lập giao thức này thì tương tự như sự tiền phân bố khóa Diffie_Hellman:
1. U chọn rU ngẫu nhiên (0 <= rU <= p-2) và tính sU = αru mod p 2. U gởi (C(U), sU) tới V
3. V chọn rV ngẫu nhiên (0 <= rV <= p-2) và tính sV = αrv mod p 4. V gởi (C(V), sV) tới U
5. U tính:
K = sVaubVru mod p = αrvau + ruav mod p (bV được lấy từ C(V)) Và V tính:
K = sUavbUrv mod p = αruav + rvau mod p (bU được lấy từ C(U)) Trong đó:
. p, α: được biết công khai.
. Mỗi user U có xâu ID(U), số mũ bí mật aU (0 <=aU<=p-2), và giá trị công khai tương ứng: bU = αau mod p. Tương tự đối với V.
. TA có sơ đồ chữ ký với giải thuật làm rỏ (công khai) verTA và giải thuật chữ ký bảo mật sigTA.
. Mỗi user U có sự chứng thực :
C(U) = (ID(U), bU, sigTA(ID(U), bU) Tương tự cho V.
. Cả U và V có cùng khóa: K = αruav + rvau mod p.
- Ví dụ: p = 27803, α = 5 được biết công khai
. Giả thiết U chọn aU = 21131, V chọn aV = 17555. Khi đó: bU = 521131 mod 27803 = 21420
bV = 517555 mod 27803 = 17100
(bU, bV được đặt trên sự chứng thực của U và V) . Giả sử U chọn rU = 169, V chọn rV = 23456. Khi đó:
sU = 5169 mod 27803 = 6268 sV = 523456 mod 27803 = 26759 U sẽ gởi sU tới V và V sẽ gởi sV tới U. . U tính khóa: KU,V = sVaubVru mod p = 267592113117100169 mod 27803 = 21600 . V tính khóa: KU,V = sUavbUrv mod p = 6268175552142023456 mod 27803 = 21600
Sự bảo mật của giao thức MTI chống lại đối phương bị động cũng tương tự như bài toán Diffie_Hellman. Khi có sự xâm nhập của đối phương chủ động W thì U và V sẽ tính những khóa khác nhau:
. U tính khóa: K = αruav + r’vau mod p. . V tính khóa: K = αr’uav + rvau mod p.
- Mặc dù U và V đã tính được những khóa khác nhau (dĩ nhiên là không có lợi cho họ) thì những khóa này cũng không được tính bởi W (vì W không biết các số mũ bí mật aU, aV). Đây là kiểu chứng thực khóa tường minh.
- Không yêu cầu viêc chứng thực, giá trị của khóa công khai và định danh của chủ nó thì được chứng thực một cách tường minh tới mỗi cái khác.
- Sơ đồ của Girault kết hợp những đặt điểm của giải thuật RSA và giải thuật rời rạc. Giả sử n =pq, p = 2p1 + 1, q = 2q1 + 1 và p, q, p1, q1 là các số nguyên tố lớn (bảo mật). Giá trị n chỉ được biết bởi TA. TA chọn một số mũ mã hóa RSA e (công khai) và số mũ giải mã d (bảo mật) mà d = e-1 mod Φ(n).
. Mỗi user U có một xâu ID(U) và đưa ra một khóa công khai chứng thực bản thân pU từ TA:
1. U chọn một số mũ bảo mật aU và tính: bU = αau mod n
2. U gởi aU và bU tới TA.
3. TA tính: pU = (bU – ID(U))d mod n. 4. TA gởi pU tới U.
.
Có thể tính bU từ pU như sau: bU = pUe + ID(U) mod n
- Giao thức đồng ý khóa Girault:
1. U chọn rU ngẫu nhiên và tính: sU = αru mod n
2. U gởi ID(U), pU và sU tới V. 3. V chọn rV ngẫu nhiên và tính:
sV = αrv mod n
4. V gởi ID(V), pV và sV tới U.
5. U tính: K = sVau(pVe + ID(V))ru mod n 6. U tính: K = sUav(pUe + ID(U))rv mod n Ở cuối giao thức U và V tính khóa:
K = αruav + rvau mod n. - Ví dụ: p = 839, q = 863, α = 5.
. Khi đó: n = pq = 724057, Φ(n) = (p - 1)(q - 1) = 722356. . TA chọn d = 125777 → e = 84453 (RSA).
. Giả sử U có ID(U) = 500021 và aU = 111899 thì: bU = 48889 và pU = 650704.
. Tương tự khi V có ID(V) = 500022 và aV = 123456 thì: bV = 111692 và pV = 683556.
. Giờ đây khi U và V muốn trao đổi khóa thì: U chọn rU = 56381 → sU = 171007 V chọn rV = 356935 → sV = 320688 . Cả U lẫn V đều tính cùng khóa: K = 42869.
- Khi đối phương W muốn giả dạng U thì W bắt đầu với ID(U) và giá trị giả b’U. Khi đó không có cách nào để W tính số mũ a’U tương ứng với b’U (nếu bài toán Discrete Log không bị bẻ gãy). Không có a’U thì việc tính toán khóa không thể được thực hiện bởi W.
- Khi W ngăn cản U và V từ việc tính toán khóa chung (W ở giữa đường truyền U và V) thì W cũng không thể sao lại việc tính toán của U hoặc V. Vì vậy sơ đồ này cung cấp sự chứng thực tường minh như trong giao thức MTI.
- Tại sao U được yêu cầu cung cấp giá trị aU tới TA trong khi TA có thể tính pU trực tiếp từ bU không cần biết aU?. Lí do là để đảm bảo tính bảo mật thì giá trị aU phải được biết trước khi TA tính pU cho U (TA tính bU dựa vào aU, sau đó so sánh với bU nhận từ U: nếu giống nhau thì chấp nhận, ngược lại thì hủy), giả sử W chọn một giá trị giả a’U và tính giá trị tương ứng: b’U = αa’u mod n.
→ p’U = (b’U – ID(U))dmod n
. W sẽ tính b’W = b’U – ID(U) + ID(W) và gởi b’W , ID(W) tới TA. Giả sử TA tính và gởi khóa bí mật p’W tới W: p’W = (b’W – ID(W))dmod n.
. Vì b’W – ID(W) = b’U – ID(U) mod n, nên p’W = p’U.
. Giả sử một thời gian sau, U và V thực thi giao thức và W thay thế thông tin như sau:
. V sẽ tính khóa : K’ = αr’uav + rva’u mod n = KW. . U sẽ tính khóa : K = αruav + rvau mod n.
Cho nên W và V sẽ tham gia cùng một khóa, trong khi V nghĩ là mình đang tham gia khóa với U. Vì vậy W sẽ có thể giải mã đoạn tin gởi từ V tới U.