Trong phép này, khoá là một hoán vị π của bảng chữ cái ∑ và mỗi kí hiệu của thông báo được thay bằng ảnh của nó qua hoán vị π.. Thường thường, khoá được biểu diễn như một chuỗi 26 kí tự,
Trang 1BÀI 14 GIỚI THIỆU VỀ MẬT MÃ HOÁ
14.1 Giới thiệu
14.2 Một số phép mật mã đơn giản
14.3 Bẻ gãy (breaking) một hệ thống mật mã
14.4 Kết hợp các phương pháp mật mã hoá
14.1 Giới thiệu
Mã hoá bảo mật đã có một lịch sử lâu đời, ở đây chúng ta không trình bày về lịch sử của nó mà chỉ trình bày các vấn đề cơ bản của nó Trước hết chúng ta trình bày ý tưởng cơ bản của mật mã hoá
Mật mã hoá
Mật mã hoá là việc biến đổi một thông báo sao cho nó không thể hiểu nổi đối với bất kỳ ai ngoại trừ người nhận được mong muốn
Để thuận tiện trình bày, chúng ta sẽ định nghĩa và kí hiệu cho các khái niệm cơ bản
Thông báo (message, plaintext)
Thông báo là một chuỗi hữu hạn kí hiệu lấy từ một bảng chữ cái ∑ và thường
được kí hiệu là m
Ở đây ∑ thường là bảng chữ cái tiếng Anh gồm 26 kí tự, thỉnh thoảng có thêm cả kí tự khoảng trắng
Phép mật mã hoá e(m)
e(m) là kí hiệu biểu diễn việc mật mã hoá m
Trong thực tế, mật mã hoá được xem như là một hàm, ánh xạ hay một giải thuật với một tập các thông số (ngoài thông số cần có là thông báo cần mã hoá) Từ đây chúng ta có khái niệm khoá
Khoá (key)
Khoá là một thông số đầu vào của phép mã hoá mà không phải là thông báo và
thường được kí hiệu là k
Một phép mật mã hoá có thể có nhiều khoá
Chuỗi mật mã (cipher, ciphertext, cryptogram)
c = e(m, k) được gọi là chuỗi mật mã
Phép giải mật mã d(c, k)
d(c, k) là kí hiệu biểu diễn việc giải mật mã hoá
Dĩ nhiên d(c, k) = m
Hệ thống mật mã (cryptosystem)
Một cách hình thức, một hệ thống mật mã được định nghĩa là một bộ ba (M, K,
C) Trong đó M là tập các thông báo m trên các bảng chữ cái ∑1, K là tập hữu hạn các khoá k, C là tập các chuỗi mật mã c, ngoài ra còn có thêm giả thiết rằng tồn tại các hàm hay giải thuật e và d sao cho
e: M × K → C d: C × K → M
và đối với mỗi cặp (m, k) ∈ M × K,
d(e(m, k) , k) = m
14.2 Một số phép mật mã đơn giản
Trang 2Trong phép này, khoá là một hoán vị π của bảng chữ cái ∑ và mỗi kí hiệu của thông báo được thay bằng ảnh của nó qua hoán vị π
Thường thường, khoá được biểu diễn như một chuỗi 26 kí tự, chẳng hạn nếu khoá là UXEOS…, thì nó biểu thị rằng bất kỳ một sự xuất hiên của A trong thông báo thì được thay bằng U, B được thay bằng X, C được thay bằng E, D được thay bằng O, E được thay bằng
S, … Các khoảng trắng thường được giữ nguyên không bị thay thế
Phép thay thế n-gram
Thay vì thay thế đối với các kí tự, người ta có thể thay thế cho từng cụm 2 kí tự (gọi là
digram) hoặc cho từng cụm 3 kí tự (gọi là trigram) và tổng quát cho từng cụm n kí tự (gọi là n-gram) Nếu bảng chữ cái ∑ gồm 26 kí tự tiếng Anh thì phép thay thế n-gram sẽ có khoá là
một hoán vị của 26n n-gram khác nhau Trong trường hợp digram thì hoán vị gồm 262
digram và có thể biểu diễn tốt nhất bằng một dãy 2 chiều 26 × 26 trong đó các hàng biểu diễn kí hiệu đầu tiên, các cột biểu diễn kí hiệu thứ hai, nội dung của các ô biểu diễn chuỗi thay thế Ví dụ bảng 2 chiều sau biểu thị AA được thay bằng EG, AB được thay bằng RS,
BA được thay bằng BO, BB được thay bằng SC, …
A B …
…
Phép hoán vị bậc d
Đối với một số nguyên dương d bất kỳ, chia thông báo m thành từng khối có chiều dài
d Rồi lấy một hoán vị π của 1, 2, …, d và áp dụng π tới mỗi khối Chẳng hạn nếu d = 5 và π
= (4 1 3 2 5), thì có nghĩa là hoán vị (1 2 3 4 5) sẽ được thay bằng hoán vị mới (4 1 3 2 5)
Ví dụ nếu chúng ta có thông báo
m = JOHN |IS A |GOOD | ACTOR
thì qua phép mật mã này sẽ trở thành chuỗi mật mã sau
c = NJHO |AI S |DGOO | OATCR
Để giải mã ngược lại ta phải tìm hoán vị ngược π-1 Trong trường hợp này chúng ta có π-1 =
(2 4 3 1 5) Tổng quát nếu π = (a 1i1 a 2i2 … a ni n) trong đó a ji j biểu thị ở vị trí thứ j chứa giá trị i j, thì π-1 = (a j 1 a j 2 a j n) có nghĩa là ở duyệt trong π ở vị trí thứ i có chứa giá
trị j thì trong π-1 ở vị trí thứ j sẽ chứa giá trị i
Phương pháp Vigenère và Caesar
Trong phương pháp này, khoá bao gồm một chuỗi của d kí tự Chúng được viết lặp lại
bên dưới thông báo và được cộng modulo 26, với chú ý rằng bảng chữ cái được đánh số từ
A = 0 đến Z = 25 Các kí tự khoảng trắng sẽ được giữ nguyên không cộng
Chẳng hạn với d = 3, nếu khoá là chuỗi ABC thì thông báo
m = M A R Y I S G O O D với khoá
k = A B C A B C A B C A trở thành
c = M B T Y J U G P Q D Trong trường hợp d = 1, như vậy khoá chỉ là một kí tự đơn, thì được gọi là phương
pháp Caesar vì được cho là được sử dụng lần đầu bởi Julius Caesar
Phương pháp Playfair
Trang 3Đây là một sơ đồ dựa trên sự thay thế digram trong đó khoá là một hình vuông kích thước 5 × 5 chứa một sự sắp xếp nào đó của 25 kí tự của bảng chữ cái (không tính kí tự J vì
sự xuất hiện ít của nó và có thể thay nó bằng I) Giả sử chúng ta có ma trận khoá như sau
B Y D G Z
W S F U P
L A R K X
C O I V E
Q N M H T
Sự thay thế sẽ được thực hiện như sau Chẳng hạn nếu digram cần thay thế là AV thì trong hình chữ nhật có A, V là hai đỉnh chéo nhau thay A bằng đỉnh kề của nó theo đường thẳng đứng chính là O và tương tự thay V bằng đỉnh kề của nó theo đường thẳng đứng chính là K Tương tự nếu digram cần thay thế là VN thì chuỗi thay thế là HO Nếu các kí tự của digram nằm trên hàng ngang thì chuỗi thay thế là các kí tự bên phải của chúng Chẳng hạn nếu digram là WU thì chuỗi thay thế là SP, nếu digram là FP thì chuỗi thay thế là UW, nếu digram là XR thì chuỗi thay thế là LK Tương tự nếu các kí tự của digram nằm trên hàng dọc thì chuỗi thay thế là các kí tự bên dưới của chúng Chẳng hạn nếu digram là SO thì chuỗi thay thế là AN, nếu digram là MR thì chuỗi thay thế là DI, nếu digram là GH thì chuỗi thay thế là UG Trong trường hợp digram là một cặp kí tự giống nhau chẳng hạn OO hoặc là một kí tự được đi kèm một khoảng trắng chẳng hạn B thì có nhiều cách xử lý, cách đơn giản nhất là giữ nguyên không biến đổi digram này
Phương pháp khoá tự động (autokey)
Trong phương pháp này, có một khoá “mồi” (priming key), cái mà thường là ngắn và được sử dụng để khởi đầu quá trình mật mã hoá Quá trình mã hoá được tiếp tục bằng cách
sử dụng cả bản thân thông báo lẫn chuỗi mật mã (cryptogram) đang chạy Xét ví dụ sau: Giả
sử khoá mồi là VENUS và thông báo là SEND SUPPLIES Đầu tiên sử dụng thông báo như một khoá đang chạy, chúng ta mã hoá bằng phép cộng mod 26 (Chú ý các khoảng trắng sẽ được bỏ qua)
Chuỗi mật mã N I A X K M T C O A Y H
Sử dụng chuỗi mật mã trên như là một khoá với khoá mồi như cũ chúng ta được kết quả mã hoá như sau
Phương pháp biến đổi tuyến tính
Ý tưởng cơ bản là chia thông báo thành những khối có chiều dài d và gắn khối này với một bộ-d (hay còn gọi là vectơ) x của các số nguyên, và rồi nhân vectơ x này với một ma trận không suy biến (tức có định thức khác 0) sẽ được chuỗi mật mã y = Ux Việc giải mã được thực hiện bằng cách nhân y với ma trận nghịch đảo U-1 của U, x = U-1y
Để đảm bảo các phép toán được thực hiện trên một trường, các tính toán sẽ được tính trong modulo của một số nguyên tố Chẳng hạn lấy bảng chữ cái ∑ gồm 37 kí tự như sau và được đánh số lần lượt từ 0 đến 36: 10 chữ số từ 0 đến 9, khoảng trắng, và 26 kí tự chữ cái
Với bảng chữ cái này, nếu chọn d = 2 và ma trận làm khoá là:
Trang 4k = U =
15 22
13 3
Thông báo m = FRIEND được biểu diễn như là
m = FR | IE | ND = 15, 27 | 18, 14 | 23, 13
Thì
=
×
35 14 32
16 14 26 13
14 27
23 18 15
15
22
13
3
Vậy chuỗi mật mã là
c = 26, 32 | 14, 14 | 16, 35 = Q, W | E, E | G, Z = QWEEGZ
14.3 Bẻ gãy (breaking) một hệ thống mật mã
Bẻ gãy một hệ thống mật mã có nghĩa là gì? Những chuyên gia mật mã hay những kẻ
tấn công thường được giả thiết biết đầy đủ thông tin về hàm mã hoá e và hàm giải mã d
Thêm vào đó, họ cũng có thể nhiều thông tin hỗ trợ như các thống kê về ngôn ngữ, kiến thức về ngữ cảnh, vân vân
Họ sẽ chắn chắn có một chuỗi mật mã nào đó, và tất cả những gì mà họ thiếu là khoá k
từ đó học có thể sử dụng d để giải mã c một cách chính xác Điều này có thể được biểu diễn
thành hình ảnh như bên dưới
Hình 14.1
Có ba khả năng tấn công cái mà chúng ta dự đoán đối phương tấn công trên hệ thống chúng ta:
(1) Tấn công chỉ dựa trên chuỗi mật mã (crytogram-only attack): Đây là trường hợp đã
được mô tả ở trên trong đó đối phương chỉ biết một vài mẫu chuỗi mật mã c
(2) Tấn công dựa trên văn bản đã biết (known-plaintext attack): Trường hợp này thực tế hơn trường hợp (1) Trong trường hợp này những người tấn công được giả thiết là đã biết một độ dài đáng kể của văn bản thông báo và chuỗi mật mã tương ứng, và từ đó
cố gắng tìm ra khoá
Đây là một sự tấn công dữ dội khó chống đỡ hơn nhiều nhưng ngày nay được xem như là một chuẩn an toàn tối thiểu phải đạt được Thật vậy vào thời điểm hiện tại, tiêu chuẩn thích hợp nhất để đánh giá một hệ thống bảo mật là rằng khả năng của nó để chống đỡ sự tấn công thậm chí còn mạnh hơn như sau
(3) Tấn công dựa trên văn bản được chọn (chosen-plaintext attack): Trong trường hợp này, những người tấn công có thể đã có được một số lượng tuỳ ý của các cặp thông
báo và chuỗi mật mã tương ứng (m, c)
Không khó để thấy rằng không có hệ thống (hay phương pháp) mật mã nào đã mô tả ở trên có thể chống đỡ một cuộc tấn công dựa trên văn bản được chọn
Bộ phát sinh khoá k
Những kẻ tấn công
m
Trang 5Trường hợp liên quan đến khả năng bị tấn công của nó đối với sự tấn công dựa trên văn bản đã biết là phức tạp hơn Chẳng hạn, xét hệ thống đơn giản nhất – hệ thống dùng
phương pháp thay thế đơn giản – sao cho khoá k là một hoán vị của 26 chữ cái trong đó A
→ P, B → F, vân vân Bây giờ nếu thông báo m được gởi là “silly message” bao gồm chữ A được lặp lại n lần, thì trong chuỗi mật mã c tương ứng, chữ P sẽ được lặp lại n lần Không thành vấn đề n lớn bao nhiêu, cặp thông báo - chuỗi mật mã cụ thể này sẽ không sinh ra khoá k Tuy nhiên nó không khó để tin rằng, trung bình, nếu đã cho một chiều dài vừa đủ
của thông báo và chuỗi mật mã, bất kỳ hệ thống hay phương pháp mật mã ở trên đều có thể
bị bẻ gãy (crack) Ở đây chúng ta xem một ví dụ đơn giản về cách bẻ gãy
Ví dụ 14.1
Giả sử một hệ thống mật mã được biết là dựa trên phương pháp Caesar với bảng chữ cái gồm 27 kí tự được đánh số như sau
A = 0, B = 1, …, Z = 25, khoảng trắng = 26
và phép cộng thực hiện theo mod 27 Chúng ta chộp được chuỗi mật mã c sau
HWXGOQCCZOXGOXBORCST
Chúng ta đề nghị cách tấn công sau để tìm khoá chưa biết k0 Chọn các khoá dự tuyển cho k0
một cách ngẫu nhiên và đổi ngược chuỗi mật mã, theo từng kí tự, cho đến khi nào thông báo
có ý nghĩa
Vì vậy, nếu đầu tiên chúng ta chọn k0 = E, chúng ta sẽ đổi ngược c và nhận được
DSTC …
tại ngữ cảnh này chúng ta thấy rằng E không phải là khoá k0 Lại chọn k0 = Z, cái này sẽ đổi
ngược c thành
JYZ … cái này bác bỏ Z
Sự lựa chọn kế tiếp (? theo linh cảm) của chúng ta là k0 = P và nhanh chóng thấy rằng chuỗi mật mã đã được biến đổi thành chuỗi văn bản có nghĩa
THIS BOOK IS IN CODE Tại ngữ cảnh này chúng ta không đảm bảo rằng không có cặp thông báo-khoá mà sẽ gởi ra cùng chuỗi mật mã Tuy nhiên thủ tục kiểm tra của những khoá khác cũng tương tự như vậy
14.4 Kết hợp các phương pháp mật mã hoá
Một cách tự nhiên để tăng tính bảo mật là kết hợp nhiều phương pháp mật mã hoá với nhau Hai cách như vậy, cái mà được Shannon đề nghị từ năm 1949, vẫn tạo nên cơ sở của nhiều hệ thống mật mã thực tế Đó là
(1) Cách dùng tổng trọng số: Nếu S1, S2, …, Sn là các hệ thống (hay phương pháp) mật mã
hoá có cùng không gian thông báo và 0 < p i < 1 và 1
1
=
∑
=
n
i i
p thì tổng của chúng
i
n
i i
S
p
∑
=1
là hệ thống mật mã dùng Si với xác suất p i
(2) Cách dùng tích: Áp dụng các hệ thống (hay phương pháp) nối tiếp nhau, đầu ra của hệ thống này là đầu vào của hệ thống kế tiếp Dĩ nhiên tập hợp đầu ra của hệ thống đi trước phải là tập con của tập hợp đầu vào của hệ thống đi sau kế tiếp