Z=EKUb [EKRa(X)] X=DKUa [DKRb(Z)]
Trước hết, chúng ta mã hoá một thông báo bằng khoá riêng của người gửi, đưa ra một chữ ký số. Tiếp theo, mã hoá một lần nữa bằng khoá công khai của người nhận. Chỉ có người nhận hợp pháp mới giải mã được bản mã cuối cùng này vì anh ta có khoá riêng cùng cặp. Như vậy sẽ đảm bảo được tính bí mật. Khó khăn của biện pháp này là thuật toán khoá công khai phải tiến hành 4 lần thay vì 2 lần cho mỗi cuộc truyền thông.
Nếu toàn bộ thông báo được mã hoá, nó đòi hỏi khả năng lưu giữ lớn. Mỗi tài liệu phải được lưu giữ ở dạng rõ. Bản sao được lưu giữ ở dạng mã, nên chúng ta có thể kiểm tra được nguồn gốc và các nội dung trong trường hợp tranh chấp. Một cách hiệu quả hơn để có được các kết quả như trên là mã hoá một khối nhỏ các bit. Khối này được gọi là dấu xác thực. Nó phải có tính chất là mọi thay đổi trên tài liệu dẫn đến sự thay đổi của dấu xác thực. Nếu dấu xác thực được mã hoá bằng khoá riêng của người gửi, nó được sử dụng như một chữ ký. Chữ ký được sử dụng để kiểm tra nguồn gốc, nội dung và trình tự.
c) Dấu xác thực (MACs)
Hầu hết thuật toán MACs được sử dụng đều dựa trên cipher – block – chaining – code (tạm dịch là chế độ liên kết khối mã) có nội dung cụ thể như sau: (Ở đây giả sử dùng mã khối DES để tạo ra MAC):
1. Cho x là một thông điệp độ dài tuỳ ý;
3. Cắt x’ thành từng khối có độ dài 64 bits, ký hiệu là x1, x2, ... xm; 4. Cho trước một vector nhị phân 64 bits ký hiệu là t;
5. Đặt yo = t;
6. Mã hoá yi = EK(yi-1 xi) với i = 1, 2, ....; 7. Giải mã:
yo = t; xi = yi-1 DK(yi) với i = 1, 2, ...
trong đó: EK(.) là mã hoá DES bởi khoá K cho trước
DK(.) là quá trình giải mã bởi thuật toán giải mã DES với k cho trước
Sau đó đặt MAC = ym. Khi chuyển bản thông báo rõ x = x1x2...xm có kèm theo khối 64 bits ym tức là thông báo truyền đến nơi nhận là (x1, ...., xm, xm+1 (xm+1 = ym)). Rõ ràng là bất kỳ sự thay đổi nào trên bản rõ x đều kéo theo sự thay đổi của khối xm+1.
2.2.5.3. Các ứng dụng hệ thống khoá công khai
Việc sử dụng một kiểu thuật toán mật mã với 2 khoá (một khoá riêng, một khoá công khai) là đặc trưng của các hệ thống khoá công khai. Tuỳ thuộc vào ứng dụng, người gửi sử dụng khoá riêng của người gửi hoặc khoá công khai của người nhận, hoặc cả hai.
Chúng ta có thể phân loại việc sử dụng các hệ thống mật mã khoá công khai thành 3 loại:
- Mã hoá/ giải mã: Người gửi mã hoá một thông báo bằng khoá công khai của người nhận.
- Chữ ký số: Người gửi "ký" thông báo bằng khoá riêng của mình. Quá trình ký được thực hiện nhờ dùng một thuật toán mật mã đối với thông báo hoặc một khối dữ liệu nhỏ.
- Trao đổi khoá: Hai thành viên trao đổi một khoá phiên. Có một vài hướng giải quyết khác nhau, cần đến một (hoặc nhiều) khoá riêng của một hoặc hai thành viên.
2.2.5.4. Lược đồ trao đổi khoá Diffie – Hellman
Giả sử hai thực thể A và B muốn trao đổi khoá mã cho nhau trên một kênh tuỳ ý không an toàn. Trước lúc truyền tin có thể thực hiện bảo mật như sau:
1. A và B thống nhất công khai một số nguyên tố đủ lớn (cỡ 512 bit) để đảm bảo việc giải bài toán logarit rời rạc là khó, và một phần tử sinh g tuỳ ý trong Z*p.
2. A lấy một số bí mật SA Z*p sau đó tính pA = gSA
mod p rồi chuyển công khai pA cho B
3. Sau khi nhận được số pA, lưu lại sau đó chọn một số bí mật SB Z*p sau đó tính pB = gSB
mod p và chuyển kết quả này cho A.
Như vậy, sau bước này, A có trong tay SA (bí mật) và pB do B chuyển cho trên kênh không an toàn còn B có được SB và pA do A chuyển cho.
4. Trên cơ sở đó, A tính kA = pBSA mod p B tính kB = pBSB mod p
Rõ ràng kA = kB ( = k), nó được dùng làm khóa chung giữa hai thực thể A và B. Khóa này có thể được sử dụng làm khoá mật mã đối xứng.
2.2.5.5. Lược đồ chia sẻ bí mật
Có nhiều lược đồ chia sẻ khoá bí mật được ứng dụng, tuy nhiên, lược đồ được trình bày dưới đây được ưa thích hơn cả.
Giả sử có n thực thể A0, A1, ..., An-1 với n > 0. Một người được uỷ quyền giả sử là A cho n thực thể như trên, A biết được toàn bộ bí mật S N. Mỗi Aj chỉ nắm được một phần bí mật của N, không một nhóm k (k ≤ n-1) thực thể nào có thể tìm được bí mật của S nhưng nếu cả n thực thể hợp lại thì bí mật S được xác định hoàn toàn. Bài toán đó được giải quyết như sau:
1. A chọn ngẫu nhiên một số nguyên tố p đủ lớn sao cho n << p1/2 và lấy một số ngẫu nhiên bí mật S Zp
2. A chọn 2n – 1 số ngẫu nhiên a1, a2, ..., an-1 và v0, v1, ..., vn-1 sao cho vi
≠ vj với mọi i ≠ j.
3. A lập đa thức f(x) = an-1xn-1 + ... + a1x + S (mod p) sau đó gửi cho mỗi Aj cặp số (vj, f(vj)). Chú ý rằng cặp số này thuộc không gian (Zp x Zp), cặp này được Aj giữ bí mật.
Để xác định được bí mật thì tất cả n thực thể hợp lực lại với nhau và đa thức để khôi phục S là:
g(x) = n-1
j=0 f(vj) 0≤i≠<n (vi - vj)-1 (vi - xi) mod p Thật vậy, ta có định lý sau đây:
Định lý: Cả n thực thể mới xác định được bí mật S = g(0) = f(0)
Chứng minh: Thật vậy, ta thấy ngay rằng g(x) chính là hàm nội suy Lagrange của hàm f(x) tại các giá trị (vj, f(vj)) (j = 0, 1, ..., n-1) với cấp bé hơn n và thoả mãn điều kiện g(vj) = f (vj) với j = 0, 1, ..., n-1
Do đó hàm h = f – g là một đa thức trên Zp có cấp bé hơn n mà lại có ít nhất n nghiệm phân biệt và h(r) = 0 với mọi r Zp suy ra f(a) = g(a) với mọi a
2.2.5.6. Một số hệ mật mã khoá công khai
Trong thực tế có rất nhiều loại mã hóa khóa công khai nhưng trong phạm vi phần này NVLV chỉ xin trình bày một số thuật toán rất phổ biến đó là Elgamal và RSA…. Trước hết bắt đầu từ các bài toán cơ sở.
Bài toán Logarit rời rạc (DL)
Xét môi trường hữu hạn Zp, p là số nguyên tố (Nhóm nhân Zp *
là nhóm cyclic và phần tử sinh của Zp
* đượcgọi là phần tử nguyên thủy).
Bài toán logarith rời rạc trong Zp là đối tượng trong nhiều công trình nghiên cứu và được xem là bài toán khó nếu p được chọn cẩn thận. Cụ thể không có một thuật toán thời gian đa thức nào cho bài toán logarith rời rạc. Để đảm bảo ban toàn, p phải có ít nhất 150 chữ số và (p-1) phải có ít nhất một thừa số nguyên tố lớn. Lợi thế của bài toán logarith rời rạc trong xây dựng hệ mã hóa là khó tìm được các logarith rời rạc, song bài toán ngược lấy lũy thừa lại có thể tính toán hiệu quả theo thuật toán “bình phương và nhân”. Nói cách khác, lũy thừa theo mođun p là hàm một chiều với các số nguyên tố p thích hợp.
Các thuật toán cho bài toán Logarit rời rạc
Trong phần này ta xem rằng p là số nguyên tố, là phần tử nguyên thuỷ theo mođun p. Ta thấy rằng p và là các số cố định. Khi đó bài toán logarith rời rạc có thể được phát biểu dưới dạng sau: tìm một số mũ a duy nhất, 0 a p-2 sao cho a (mod p), với Zp
*
cho trước.
Rõ ràng là bài toán logarith rời rạc có thể giải bằng một phép tìm kiếm vét cạn với thời gian cỡ O(p) và không gian cỡ O(1) (bỏ qua các thừa số logarith). Bằng cách tính toán tất cả các giá trị a có thể và sắp xếp các cặp có thứ tự (a, a
mod p) có lưu ý đến các toạ độ thứ hai của chúng, ta có thể giải bài toán DL với thời gian cỡ O(1) bằng O(p) phép tính toán trước và O(p) bộ nhớ (vẫn bỏ qua các thừa số logarith). Có một số thuật toán cho bài toán logarith rời rạc như: Shanks, Pohlig-Hellman, phương pháp tính toán chỉ số… Chúng ta sẽ mô tả một thuật toán có tên là Shanks, một thuật toán tối ưu hóa thời gian - bộ nhớ của Shanks.
Đặ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 thủy, 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
Nếu cần, các bước 1, 2 và 4 có thể tính toán trước
Tiếp theo cần để ý là nếu (j,y) L1 và (i,y) L2 thì mj
= y = -i
Bởi vậy mj+i
= như mong muốn.
Ngược lại, đối với bất kì ta có thể viết: log = mj+i
Trong đó 0 j,i m-1. Vì thế phép tìm kiếm ở bước 5 chắc chắn thành công.
Có thể áp dụng thuật toán này chạy với thời gian O(m) và với bộ nhớ cỡ O(m) (bỏ qua các thừa số logarith). Chú ý là bước 5 có thể thực hiện một cách (đồng thời) qua từng danh sách L1 và L2.
Hệ mật RSA
Khái niệm hệ mật mã RSA đã được ra đời năm 1976 bởi các tác giả R.Rivest, A.Shamir, và L.Adleman. Hệ mã hóa này dựa trên cơ sở của hai bài toán :
Bài toán Logarith rời rạc.
Bài toán phân tích thành thừa số.
Trong hệ mã hóa RSA các bản rõ, các bản mã và các khóa (public key và private key) là thuộc tập số nguyên Zn = {0, . . . , n-1}. Trong đó tập Zn với n = pq trong đó p và q là các số nguyên tố khác nhau và đủ lớn. Khóa mã hóa EKB là cặp số nguyên (n,KB) và khóa giải mã DKB là cặp số nguyên (n,kB), tất cả các số là rất lớn, thậm chí số n có thể lên tới hàng trăm chữ số.
1. Đặt m = p-1 2. Tính mj
mod p, 0 j m-1 3. Sắp xếp m cặp thứ tự (j,mj
mod p) có lưu ý tới các toạ độ thứ hai của các cặp này, ta sẽ thu được một danh sách L1
4. Tính -i
mod p, 0 i m-1 5. Sắp xếp m cặp thứ tự (i, -i
mod p) có lưu ý tới các tọa độ thứ hai của các cặp được sắp này, ta sẽ thu được một danh sách L2
6. Tìm một cặp (j,y) L1 và một cặp (i,y) L2 (tức là một cặp có toạ độ thứ hai như nhau)
7. Xác định log = mj + i mod (p-1)
Công việc mã hóa là sự biến đổi bản rõ P (Plaintext) thành bản mã C (Ciphertext) dựa trên cặp khóa công khai KB và bản rõ P theo công thức sau đây :
C = EKB(P) = PKB (mod n) (1)
Công việc giải mã là sự biến đổi ngược lại bản mã C thành bản rõ P dựa trên cặp khóa bí mật kB , mođun n theo công thức sau :
P = DkB(C) = CkB (mod n) (2)
Dễ thấy rằng, bản rõ ban đầu cần được biến đổi một cách thích hợp thành bản mã, sau đó để có thể tái tạo lại bản rõ ban đầu từ chính bản mã đó :
P = DkB(EKB(P)) (3) Thay thế (1) vào (2) ta có :
(PKB)kB = P (mod n) (4)
Ta thấy n = pq với p, q là số nguyên tố lớn, phân biệt. Trong toán học đã chứng minh được rằng công thức (4) sẽ có lời giải khi và chỉ khi:
KB.kB 1 (mod (n)) (5)
trong đó (n) = LCM(p-1,q-1) là bội số chung nhỏ nhất của p-1 và q-1.
Định nghĩa hệ mật RSA
Nói một cách khác, đầu tiên người nhận B lựa chọn một khóa công khai K một cách ngẫu nhiên. Khi đó khóa bí mật k được tính ra bằng công thức
Chuẩn bị
Cho n = p*q với p,q là số nguyên tố lớn, khác nhau.
Đặt (n) = (p-1)*(q-1)
Chọn b nguyên tố với (n)
Định nghĩa khóa K = {(n,a,b): a*b1 (mod (n))}
Một cách ký hiệu khác: K = {(n,Kb,kb): Kb*kb 1 (mod
(n))}
Xác định hệ mật RSA
Hai giá trị n, b công khai; các giá trị a là bí mật
Với mỗi giá trị K=(n, a, b) và xP; yC ta xác định hai hàm sau
Hàm mã hóa: y = ek(x) = xb mod n
(5). Ðiều này hoàn toàn tính được vì khi B biết được cặp số nguyên tố (p,q) thì sẽ tính được (N).
Ðộ an toàn của hệ RSA
Một nhận định chung là tất cả các cuộc tấn công giải mã đều mang mục đích không tốt. Tính bảo mật của RSA chủ yếu dựa vào việc giữ bí mật khóa giải mã hay giữ bí mật các thừa số p,q của n. Ta thử xét một vài phương thức tấn công điển hình của kẻ địch nhằm giải mã trong thuật toán này.
Trường hợp 1: Chúng ta xét đến trường hợp khi kẻ địch nào đó biết được mođun n, khóa công khai KB và bản tin mã hóa C, khi đó kẻ địch sẽ tìm ra bản tin gốc như thế nào. Có thể tấn công bằng hai phương thức sau đây:
Phương thức thứ nhất: Trước tiên dựa vào phân tích thừa số mođun n thành hai số nguyên tố p và q, và nếu thành công sẽ tính được (n) = (p-1)(q-1) và khóa bí mật kB. Ta thấy n cần phải là tích của hai số nguyên tố, vì nếu n là tích của hai số nguyên tố thì thuật toán phân tích thừa số đơn giản cần tối đa n1/2
bước, bởi vì có một số nguyên tố nhỏ
Chọn p và q Tính N=pq Tính (N) Chọn khóa KB C = PKB (mod N) P = CkB ( mod N ) Chọn khóa kB KB kB Bản rõ P Bản mã C Bản rõ gốc P
Sơ đồ các bước thực hiện mã hóa theo thuật toán RSA
hơn n1/2. Mặt khác, nếu n là tích của n số nguyên tố, thì thuật toán phân tích thừa số đơn giản cần tối đa n1/n
bước.
Phương thức thứ hai: Phương thức tấn công thứ hai vào hệ mã hóa RSA là có thể khởi đầu bằng cách giải quyết trường hợp thích hợp của bài toán logarit rời rạc. Trường hợp này kẻ địch đã có trong tay bản mã C và khóa công khai KB tức là có cặp (KB, C)
Trường hợp 2: Chúng ta xét trường hợp khi kẻ địch nào đó biết được mođun n và (n), khi đó kẻ địch sẽ tìm ra bản tin gốc bằng cách sau:
Biết (n) thì có thể tính p, q theo hệ phương trình: p q = n, (p-1)(q-1) = (n)
do đó p và q là nghiệm của phương trình bậc hai: x2 - (n - (n) +1) + n = 0
Trường hợp 3: Người ta thường lợi dụng tấn công và RSA, khi đối phương dùng số mũ mã hoá nhỏ hoặc dùng số mũ bí mật nhỏ.
Một số tính chất của hệ RSA
- Trong các hệ mật mã RSA, một bản tin có thể được mã hóa trong thời gian tuyến tính.
- Các khóa cho hệ mã hóa RSA có thể được tạo ra mà không phải tính toán quá nhiều.
Tính chất này liên quan đến các phương pháp kiểm tra số nguyên tố. Mỗi số nguyên tố lớn có thể được phát sinh bằng cách đầu tiên tạo ra một số ngẫu nhiên lớn, sau đó kiểm tra các số kế tiếp cho tới khi tìm được một số nguyên tố. Một phương pháp đơn giản thực hiện một phép tính trên một con số ngấu nhiên, với xác suất 1/2 sẽ chứng minh rằng số được kiểm tra không phải nguyên tố. Bước cuối cùng là tính p dựa vào thuật toán Euclid.
Như phần trên đã trình bày trong hệ mã hóa công khai thì khóa giải mã (private key) kB và các thừa số p,q là được giữ bí mật và sự thành công của phương pháp là tuỳ thuộc vào kẻ địch có khả năng tìm ra được giá trị của kB
hay không nếu cho trước N và KB. Rất khó có thể tìm ra được kB từ KB, cần biết về p và q. Như vậy cần phân tích N ra thành thừa số để tính p và q. Nhưng việc phân tích ra thừa số là một việc làm tốn rất nhiều thời gian, với kỹ thuật hiện đại ngày nay thì cần tới hàng triệu năm để phân tích một số có 200 chữ số ra thừa số.
Ðộ an toàn của thuật toán RSA dựa trên cơ sở những khó khăn của việc xác định các thừa số nguyên tố của một số lớn. Bảng dưới đây cho biết các