Tổng quan về mã hóa và nén dữ liệu. Otomat trong mã hóa và an toàn thông tin. Ứng dụng Otomat trọng số (WFA) trong nén ảnh. Tổng quan về mã hóa và nén dữ liệu. Otomat trong mã hóa và an toàn thông tin. Ứng dụng Otomat trọng số (WFA) trong nén ảnh.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
-BÙI MINH TUỆ
MỘT VÀI ỨNG DỤNG CỦA OTOMAT TRONG MÃ HÓA VÀ NÉN DỮ LIỆU
LUẬN VĂN THẠC SĨ KHOA HỌC
ĐẢM BẢO TOÁN HỌC CHO MÁY TÍNH VÀ CÁC HỆ THỐNG TÍNH TOÁN
Thầy hướng dẫn: PGS TS PHAN TRUNG HUY
Hà Nội – Năm 2010
Trang 2MỤC LỤC
MỞ ĐẦU 3
CHƯƠNG I:TỔNG QUAN VỀ MÃ HÓA VÀ NÉN DỮ LIỆU 5
1.1 Khái niệm về mật mã 5
1.2 Một số hệ thống mã hoá kinh điển 7
1.2.1 Mã chuyển dịch (Shift Cipher) 7
1.2.2 Hệ mã tuyến tính (Affine Cipher) 8
1.2.3 Hệ mã Vigenere 11
1.2.4 Hệ mã Hill 12
1.3 Mã hóa khóa công khai 14
1.4 Nguyên tắc của nén dữ liệu 20
1.5 Nén dữ liệu = Mô hình hóa + Mã hóa 21
1.6 Mô hình hóa nguồn dữ liệu 22
1.6.1 Mô hình thống kê 22
1.6.2 Mô hình từ điển 23
1.7 Một số phương pháp nén dữ liệu 24
1.7.1 Phương pháp mã hóa độ dài loạt (Run Length Coding) 24
1.7.2 Phương pháp mã hóa Huffman 26
1.7.3 Phương pháp nén LZW 31
CHƯƠNG II:OTOMAT TRONG MÃ HÓA VÀ AN TOÀN THÔNG TIN 38 2.1 Văn phạm và sự phân lớp văn phạm 38
2.1.1 Định nghĩa văn phạm cấu trúc 38
2.1.2 Sự phân cấp Chomsky trên văn phạm 39
2.1 Otomat hữu hạn 42
2.1.1 Otomat hữu hạn đa định - NFA 42
2.1.2 Otomat hữu hạn đơn định - DFA 43
2.1.3 Biểu diễn đại số của otomat 44
2.2 Bài toán quản lý khóa số 44
2.2.1 Phát biểu bài toán 45
2.2.2 Mô hình cài đặt 47
2.3 Otomat như hàm mã hóa 49
2.3.1 Sơ đồ hoạt động 49
2.3.2 Thuật toán 59
Trang 32.3.3 Đánh giá độ an toàn của phương pháp 62
CHƯƠNG III 65
ỨNG DỤNG OTOMAT TRỌNG SỐ (WFA) TRONG NÉN ẢNH 65
3.1 Các dạng ảnh 65
3.1.1 Ảnh đa phân giải 68
3.1.2 Ảnh hai cấp đa phân giải 71
3.2 Ngôn ngữ chính qui như các ảnh hai cấp 74
3.3 Otomat hữu hạn có trọng số - WFA 78
3.4 Vẽ các ảnh WFA 83
3.5 Thuật toán mã hóa 85
3.6 Nén ảnh sử dụng WFA 91
KẾT LUẬN 99
TÀI LIỆU THAM KHẢO 100
Trang 4MỞ ĐẦU
Ngày nay, thông tin có vai trò và giá trị ngày càng lớn Công nghệ thông tin xâm nhập vào hầu hết các hoạt động xã hội Khi thông tin đóng vai trò ngày càng quan trọng thì vấn đề bảo mật thông tin, tránh các truy cập bất hợp pháp trở nên cấp thiết Một trong những biện pháp hiệu quả để bảo mật thông tin là
mã hóa Mã hóa được áp dụng trong rất nhiều hoạt động kinh tế xã hội Chẳng hạn, ngân hàng là một trong các lĩnh vực mà các hệ thống mã hóa được áp dụng rất phổ biến, nhờ mã hóa mới có thể thực hiện các giao dịch trực tuyến qua mạng một cách an toàn Lịch sử đã có rất nhiều hệ mã được áp dụng từ các hệ mã cổ điển như mã tuyến tính đến những hệ mã hiện đại như AES, RSA …
Cùng với sự phát triển của Internet, nhu cầu truyền dữ liệu qua mạng ngày một tăng Nếu như với lượng thông tin nguyên thủy để truyền qua mạng thì sẽ tốn rất nhiều thời gian và tiền bạc, do đó dữ liệu trước khi truyền cần được nén Nén dữ liệu là một biểu hiện hết sức sinh động của ứng dụng lý thuyết thông tin, khởi đầu với các công trình nghiên cứu của Claude Shannon ở Bellads vào cuối những năm 40 Nó liên quan đến nhiều vấn đề về thông tin, bao gồm các phương pháp khác nhau dùng để xử lý, lưu trữ và truyền thông tin Thế giới đã có rất nhiều thuật toán có hiệu quả trong việc nén dữ liệu và được chia làm hai loại: Nén có mất mát thông tin (Run-length, Huffman, LZW, …) và nén không mất mát thông tin (JPEG, MPEG, …) Nén dữ liệu cũng có thể xem là một dạng mã hóa thông tin
Mục đích chính của luận văn tìm hiểu về một số phương pháp mã hóa và nén
dữ liệu, đặc biệt, một số phương pháp mới ứng dụng lý thuyết otomat
Nguyên lý của otomat được đưa ra từ giữa thế kỷ 20, trong mối liên hệ với ngôn ngữ hình thức và các hệ thống điều khiển hữu hạn trạng thái Gần đây,
Trang 5các hình thức otomat nâng cao như otomat xác suất, otomat có trọng số, đã được nhiều tác giả tập trung nghiên cứu, thu được nhiều kết quả lý thú (xem [6], [10], [13] …)
Ngoài phần Mở đầu, Kết luận và Tài liệu tham khảo, nội dung chính của luận văn được trình bày trong ba chương
Chương I: “Tổng quan về mã hóa và nén dữ liệu” Trình bày các
khái niệm cơ sở về mật mã, nén dữ liệu và giới thiệu một số phương pháp mã hóa, nén dữ liệu đang được áp dụng
Chương II: “Otomat trong mã hóa và an toàn thông tin” Chương
này dành để trình bày một số khái niệm cơ bản về văn phạm Đặc biệt, đưa ra một mô hình mã hóa mới theo cách tiếp cận otomat hữu hạn trong mối liên hệ với các cấu trúc đại số
Chương III : “Ứng dụng otomat trọng số trong nén ảnh” Trình bày
một phương pháp nén ảnh sử dụng otomat có trọng số được nghiên cứu gần đây Phương pháp này có nhiều khả năng ứng dụng vì chất lượng
và tỷ lệ nén cao, có thể so sánh với các phương pháp truyền thống như JPEG, Fractal, …
Trang 6CHƯƠNG I TỔNG QUAN VỀ MÃ HÓA VÀ NÉN DỮ LIỆU
Mục đích chính của chương này là trình bày các khái niệm cơ sở về mật mã, nén dữ liệu, giới thiệu một số hệ thống mã hóa như mã chuyển dịch, mã tuyến tính, RSA, … và một số phương pháp nén dữ liệu đang được áp dụng như mã hóa Huffman, nén LZW,
1.1 Khái niệm về mật mã
Từ rất lâu, thông tin đã có vai trò quan trọng trong xã hội Khi có thông tin tất nhiên sẽ có nhu cầu trao đổi thông tin, truyền tin Và một cách tự nhiên cần có những cách trao đổi thông tin an toàn Ngay từ thời cổ đại, mã hoá đã được Juilus Caesar áp dụng để trao đổi tin tức quân sự Một cách ngắn gọn, mục đích của mã hoá là cho phép hai bên A và B có thể giao tiếp an toàn qua các kênh thông tin không được bảo mật sao cho người thứ ba O không biết được thông tin gì thực sự được trao đổi Thông tin ban đầu cần trao đổi gọi là bản
rõ (plain text, trong một số tài liệu gọi là bản hiện) Để trao đổi, A thực hiện
mã hoá bản rõ bằng khoá mã định trước thu được bản mã và gửi bản mã (cipher text) cho B qua kênh thông tin O có thể thu được bản mã gửi đi nhưng không biết bản rõ A muốn gửi Còn B, với khoá giải mã, có thể giải mã bản mã nhận được và thu được bản rõ ban đầu
Một cách hình thức, có thể định nghĩa hệ mã như sau
Hệ mã (Cryptosystem) là bộ P C K E D thoả mãn các điều kiện sau , , , ,
(1) P là tập hữu hạn các bản rõ có thể có;
(2) C là tập hữu hạn các bản mã có thể có;
(3) K là không gian khoá mã, là tập hữu hạn các khoá mã có thể có;
Trang 7(4) Với mỗi khoá kK có một quy tắc mã , e kE và quy tắc giải mã
Ta để ý tính chất cơ bản (4), nó thể hiện rằng mỗi bản rõ x được mã hoá bằng
Với một hệ mã cụ thể A và B thực hiện giao thức như sau: Đầu tiên, họ chọn
xác định bởi khoá mã K định trước Từ đó, A tính được
Trang 8và thu được thông điệp mã hoá y y y1 2 y được gửi đến B qua kênh thông n
hay x Để ý rằng, nếu 2 PC thì mọi hàm mã hoá đều là một hoán vị trên
một tập thích hợp
1.2 Một số hệ thống mã hoá kinh điển
1.2.1 Mã chuyển dịch (Shift Cipher)
Hệ mã chuyển dịch là hệ mã xuất hiện sớm nhất, đã được Juilus Caesar áp dụng từ thời trung cổ để trao đổi thông tin quân sự Sơ đồ hệ mã chuyển dịch được mô tả như sau
Ta tương ứng mỗi chữ cái với một số nguyên: A 0, B 1, Hệ mã
1.1
Trang 9Ví dụ 1.1 Giả sử ta sử dụng khoá K 11 và chuỗi bản rõ là “khoatoan”
Đầu tiên, dùng Bảng 1.1, ta biến đổi thành chuỗi các số nguyên
Để giải mã, đầu tiên B chuyển đổi chuỗi bản mã sang chuỗi số tự nhiên, sau
đó, trừ mỗi số đi 11 (khoá K ) và giản ước mod 26 và cuối cùng, chuyển đổi
ngược lại thành ký tự, B thu được dòng bản rõ ban đầu
Để có thể áp dụng trong thực tế, hệ mã hoá cần thoả mãn một số tính chất, dưới đây là hai trong số đó
đã dùng hoặc bản rõ x ban đầu
1.2.2 Hệ mã tuyến tính (Affine Cipher)
Trong hệ mã tuyến tính, hàm mã hoá là hàm tuyến tính (affine) có dạng
Trang 10Để quá trình giải mã là duy nhất, ta cần có hàm mã hoá là đơn ánh, tức là với
mod 26
ax b y
có nghiệm duy nhất Dễ thấy rằng, phương trình trên có nghiệm duy nhất khi
hàm tính ước chung lớn nhất (UCLN)
Một cách tổng quát ta có
Định lý 1.1 Phương trình đồng dư axbmodn có nghiệm duy nhất
0mod
xx n với mọi b khi và chỉ khi gcda n, 1
Vì 26 = 2 13 nên ta có các giá trị có thể của a là tập
{1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25}
= 312 khoá khác nhau
thừa số
1
n e i i
Trang 11Ta chuyển sang thao tác giải mã trong mod 26 Giả sử gcda, 261 Để giải
(multiplicative inverse), ta có thể tìm được nghiệm phương trình
Trang 12ký tự ánh xạ đến chỉ một ký tự khác Do đó, người ta gọi các hệ mã đó là đơn
ký tự (monoalphabetic) Ngoài các hệ mã đơn ký tự, còn có các hệ mã đa ký
tự (polyalphabetic), ta sẽ xem xét một hệ mã cổ điển là hệ Vigenere, lấy theo tên của Blaise de Vigenere Vẫn áp dụng các ánh xạ như cũ A 0, ta có
thể gắn mỗi khoá K với chuỗi ký tự độ dài m gọi là từ khoá Hệ mã Vigenere
mã hoá theo từng khối m ký tự hiện
Ví dụ 1.3 Giả sử m6 và từ khoá là CIPHER, tương đương với biểu diễn
khoatoanbkhn Đầu tiên, ta biến đổi thành chuỗi các số nguyên tương ứng, nhóm từng bộ 6
số lại được
(10, 7, 14, 0, 19, 14), (0, 13, 1, 10, 7, 13), rồi cộng với từ khoá theo mod 26 như sau
Trang 13Có thể thấy rằng, số từ khoá với độ dài m có thể có 26 m khả năng khác nhau,
như thế với giá trị m không lớn, việc thử và sai toàn bộ các khả năng cũng
thủ công
với một trong số m ký tự có thể (giả sử rằng từ khoá có m ký tự khác nhau)
Hệ mã có tính chất đó gọi là hệ mã đa ký tự (polyalphabetic) Nói chung, phá khoá hệ mã đa ký tự khó khăn hơn trường hợp hệ mã đơn ký tự
1.2.4 Hệ mã Hill
Ta xem xét hệ mã đa ký tự khác, đó là hệ mã Hill Hệ mã này được Lester
Tư tưởng của Hill là sử dụng m tổ hợp tuyến tính của m ký tự trong một phần tử bản rõ, từ đó sinh ra m ký tự trong một phần tử bản mã
Ví dụ 1.4 Giả sử m2, ta có thể viết phần tử bản rõ dưới dạng xx x1, 2 và
Với xx1, ,x mP và KK ta tính được , ye x k y1, ,y m như sau
Trang 14Ta nói rằng, bản mã thu được từ bản rõ bằng biến đổi tuyến tính Ta còn phải
18 7
1
K
Giả sử, ta cần mã hoá từ july
Ta chia thành 2 khối ju = (9, 20) và ly = (11, 24) Nhân với ma trận khoá
811
8 11
18 7
187
= (11, 24)
Trang 151.3 Mã hóa khóa công khai
Trong các hệ mã hoá ban đầu, khi hai bên A và B muốn trao đổi thông tin, họ
Để khắc phục nhược điểm đó, ý tưởng dùng hệ mã khoá công khai xuất hiện,
khai Ưu điểm của hệ mã khoá công khai là bên A có thể gửi thông điệp được
mã hoá cho B dùng hàm mã hoá được công khai của B (mà không cần trao
Mã khóa sử dụng khóa công khai (còn gọi là mã hóa bất đối xứng) liên quan đến cặp khóa - một khóa bí mật và một khóa công khai - giao tiếp với một thực thể cần xác thực nhận dạng hoặc để ký hay mã hóa dữ liệu Mỗi khóa công khai được công bố tương ứng sẽ có một khóa bí mật Dữ liệu được mã hóa bởi khóa công khai chỉ có thể giải mã bằng khóa bí mật tương ứng với nó
Trang 16Cách thức hoạt động đơn giản của mã hóa khóa công khai
Hình 1.2 Mã hóa khóa công khai
Tư tưởng về hệ mã khoá công khai được Diffie và Hellman đề xuất vào 1976 Sau đó, hệ mã khoá công khai đầu tiên được xây dựng vào năm 1977 bởi ba nhà toán học Rivest, Shamir và Adleman, do đó có tên là hệ mã RSA
Hệ mã RSA dựa trên bài toán phân tích số nguyên n thành tích các thừa số
nguyên tố lẻ p và q Để ý rằng n p1q1 Hệ RSA được mô tả như sau
Trang 171 modmod
bằng thuật toán Euclide mở rộng
Trang 18và thu được bản rõ A muốn gửi
như thế người thứ ba không thể phá khoá trong khoảng thời gian chấp nhận
Trang 19Mô tả RSA
Việc thực hiện hệ RSA có nhiều vấn đề cần giải quyết, ví dụ như về độ mật, làm thế nào để mã hoá và giải mã nhanh chóng Một cách hình thức, các bước thực hiện mã hoá RSA có thể mô tả như sau
B1 B sinh ra hai số nguyên tố lớn p và q
a b n bằng thuật toán Euclide
B5 B công khai n và b như là khoá
Luỹ thừa số lớn
Các bước mã hoá và giải mã đều liên quan đến các phép toán luỹ thừa Bởi vì
n rất lớn, ta cần có các thuật toán hiệu quả để tính toán trong n
mod nhân
Trang 20Để thực hiện phép lấy mod luỹ thừa, ta dùng thuật toán “bình phương và nhân
Ta có thể thấy rằng, một phương thức tấn công hiển nhiên sử dụng phép phân
được a giống như B làm (Người ta đã giả thiết rằng phá hệ RSA tương đương
đa thức với bài toán phân tích n ra thừa số)
Tất nhiên, để có thể áp dụng thì n phải đủ lớn để cho phân tích n ra thừa số là
phi thực tế Các thuật toán hiện nay có thể phân tích một số 130 chữ số Tuy
nhiên, để đảm bảo an toàn thì các số p và q phải có kích thước vào khoảng
100 chữ số để n có kích thước khoảng 200 chữ số Các hệ mã ứng dụng hiện
nay thường dùng mã 512 bit (tức là có kích thước khoảng 154 chữ số), kích thước đó chưa đảm bảo an toàn cao Điều đó chứng tỏ để đảm bảo an toàn, khoá cần phải có kích thước ít nhất 1024 bit
Trang 211.4 Nguyên tắc của nén dữ liệu
Nhiều dữ liệu đòi hỏi phải được nén trước khi phát vì các ứng dụng đó sử dụng các mạng truyền dẫn công cộng (PSTN chẳng hạn) Rõ ràng, đối với một cuộc gọi để truyền dẫn dữ liệu, nếu giảm được thời gian truyền dẫn thì sẽ tiết kiệm được chi phí
Giả sử, chúng ta đang truyền dữ liệu dùng modem 4800 bps trên PSN và thời gian truyền là 20 phút Nếu nén dữ liệu xuống còn một nửa thì thời gian truyền chỉ còn 10 phút và do đó tiết kiệm được 50% cước phí Nói cách khác, chúng ta đạt được cùng một hiệu quả khi dùng modem 4800 bps để truyền dữ liệu có nén với dùng modem 9600 bps để truyền dữ liệu chưa nén
Có thể sử dụng nhiều thuật toán nén dữ liệu khác nhau Mỗi một thuật toán thích hợp với một kiểu dữ liệu nhất định Một số modem có đặc điểm nén thích ứng (adaptive), nghĩa là chúng có khả năng chọn một thuật toán nén thích hợp để nén phụ thuộc vào kiểu dữ liệu cần truyền
Nén dữ liệu là một biểu hiện hết sức sinh động của lý thuyết thông tin Đó là ngành toán học ra đời vào cuối những năm 1940 từ các công trình nghiên cứu của Claude Shanon ở Bellads Nó liên quan đến nhiều vấn đề về thông tin, bao gồm các phương pháp khác nhau dùng để xử lý, lưu trữ và truyền thông tin
Nén dữ liệu liên quan với khái niệm độ dư thừa dữ liệu (Data Redundency) Thông thường, hầu hết các tập tin trong máy tính có rất nhiều thông tin dư thừa, việc thực hiện nén tập tin thực chất là mã hoá lại các tập tin để loại bỏ các thông tin dư thừa
Nhìn chung, không thể có phương pháp nén tổng quát nào cho kết quả tốt đối với tất cả các loại tập tin, vì nếu không ta sẽ áp dụng n lần phương pháp nén này để đạt được một tập tin nhỏ tuỳ ý Kỹ thuật nén tập tin thường được áp
Trang 22dụng cho các tập tin văn bản (trong đó có một số kí tự nào đó có xác suất xuất hiện nhiều hơn các kí tự khác), các tập tin ảnh bitmap (mà có thể có những mảng lớn đồng nhất), các tập tin dùng để biểu diễn âm thanh dưới dạng số hoá và các tín hiệu tương tự (analog signal) khác (Các tín hiệu này có thể có các mẫu được lặp lại nhiều lần) Ðối với các tập tin nhị phân như tập tin chương trình thì sau khi nén cũng không tiết kiệm được nhiều
Ngoài ra, trong một số trường hợp để nâng cao hệ số nén người ta có thể bỏ bớt một số thông tin của tập tin (Ví dụ như kỹ thật nén ảnh JPEG)
1.5 Nén dữ liệu = Mô hình hóa + Mã hóa
Một cách tổng quát, nén dữ liệu là biến đổi một luồng các ký tự thành một luồng các bản mã Nếu các luồng bản mã có kích thước nhỏ hơn các luồng ký
tự thì chứng tỏ kỹ thuật nén có tác dụng Việc lựa chọn để đưa ra một bản mã nhất định đối với một ký tự hoặc một tập ký tự nhất định được thực hiện dựa trên mô hình (model) Mô hình là một tập hợp dữ liệu cùng các qui tắc được dùng để xử lý các ký tự vào và đưa ra các bản mã Một mô hình sẽ xác định chính xác xác suất xuất hiện của từng ký tự và một bộ mã hóa sẽ tạo ra các bản mã dựa trên các xác suất đó
Mô hình hóa và mã hóa là hai vấn đề hoàn toàn khác nhau Thế nhưng, người
ta vẫn quen dùng từ “mã hóa” để chỉ cho cả quá trình nén dữ liệu mặc dù đó mới chỉ là một giai đoạn của quá trình đó Chẳng hạn, ta vẫn dùng “Mã hóa Huffman”, “Mã hóa Run-Length”, … để nói về các kỹ thuật nén dữ liệu trong khi đó chúng thực chất chỉ là phương pháp mã hóa được sử dụng cùng với các
mô hình nào đó để nén dữ liệu
Lấy mã Huffman quen thuộc làm ví dụ, ta thấy một quá trình nén dữ liệu đầy
đủ được biểu diễn như Hình 1.3
Trang 231.6 Mô hình hóa nguồn dữ liệu
Nếu chúng ta ví nén dữ liệu như là một chiếc ô tô thì phương pháp mã hóa là các bánh xe, còn mô hình mới là động cơ của nó Bất chấp hiệu quả của bộ
mã hóa, nếu không có một mô hình tốt sẽ không có nén dữ liệu
Nén không tổn hao nói chung được thực hiện dựa trên một trong hai kiểu mô hình khác nhau: Mô hình thống kê (Statistics) và mô hình từ điển (Dictionary-based) Nén dữ liệu dùng mô hình thống kê sẽ mã hóa mỗi lúc một ký tự dựa vào xác suất xuất hiện của nó Nén dữ liệu dùng mô hình từ điển sẽ mã hóa một chuỗi ký tự chỉ bằng một bản mã, ở đây vai trò của mô hình trở nên cực
kỳ quan trọng
1.6.1 Mô hình thống kê
Mô hình thống kê đơn giản nhất là một bảng tĩnh liệt kê các giá trị xác suất Trước đây, do việc phân tích và xây dựng cây mã Huffman rất tốn thời gian nên người ta thường chỉ phân tích một lần đối với các khối dữ liệu điển hình
để có được một bảng đếm số lần xuất hiện của từng ký tự Dựa vào kết quả
đó, một cây Huffman tĩnh được xây dựng và lưu trữ để có thể sử dụng được nhiều lần Một mô hình như vậy được gọi là mô hình thống kê tĩnh (Static-Statistical Model)
Các bản mã Các xác suất
Các ký hiệu
Hình 1.3 Sơ đồ nén Huffman
Trang 24Việc sử dụng một mô hình vạn năng cho nhiều kiểu dữ liệu rõ ràng là có nhiều hạn chế Nếu luồng vào không thích hợp với mô hình thì hiệu quả nén
sẽ giảm, thậm chí có khi kết quả là ngược lại, luồng ra sẽ có kích thước lớn hơn luồng vào (nở dữ liệu)
1.6.2 Mô hình từ điển
Các mô hình thống kê có đặc điểm chung là mã hóa (và giải mã) mỗi lúc một
ký hiệu, trong khi các mô hình từ điển làm việc theo cơ chế hoàn toàn khác Chúng đọc dữ liệu vào rồi tìm một nhóm ký tự tương hợp hiện có trong một
từ điển, nếu tìm thấy thì chúng xuất ra một con trỏ đến nhóm ký hiệu đó chứ không phải xuất ra một bản mã như các mô hình thống kê đã làm Dữ liệu đọc vào càng tương hợp với nhóm ký tự tìm thấy trong từ điển thì hiệu quả nén càng cao Ở đây, phương pháp mã hóa không thành vấn đề, vấn đề chính cần phải tập trung giải quyết là mô hình
Một từ điển tĩnh (Static Dictionary) tựa như một danh sách tài liệu tham khảo dùng trong sách báo khoa học Trong suốt bài báo cáo, các tác giả thường thay thế các sách tham khảo bằng một con số nằm trong ngoặc vuông Con số
đó trỏ đến một cuốn sách hoặc một bài báo khác có trong danh sách tài liệu tham khảo Việc chỉ dùng một con số để khỏi phải viết đầy đủ cả đầu đề của một bài báo hoặc cuốn sách (nếu xảy ra nhiều lần) rõ ràng có tác dụng rút ngắn được bài báo đang viết
Nhược điểm của mô hình từ điển tĩnh cũng giống như nhược điểm của mô hình thống kê tĩnh Từ điển cũng phải phát đi trước khi phát dữ liệu được mã hóa do đó làm giảm hiệu quả nén Để tránh nhược điểm đó, phải sử dụng một
từ điển động
Một từ điển động tựa như cách người ta viết tắt trong sách giáo khoa Muốn viết tắt một cụm từ nào đó thì lần xuất hiện đầu tiên của nó sẽ được kèm theo
Trang 25các ký tự viết tắt trong cặp ngoặc đơn Từ đó về sau chỉ sử dụng cụm ký tự viết tắt đó mà thôi Ví dụ: Công ty trách nhiệm hữu hạn thương mại và dịch
vụ Thắng Lợi (CTTNHH TM&DV TL) CTTNHH TM&DV TL hoạt động trong lĩnh vực
1.7 Một số phương pháp nén dữ liệu
Các kỹ thuật nén dữ liệu có thể chia thành hai loại chính
Nén không tổn hao (Lossless);
mã Đây chính là các kỹ thuật nén được sử dụng để lưu trữ và truyền các cơ
sở dữ liệu, các bảng tính điện tử và các văn bản
1.7.1 Phương pháp mã hóa độ dài loạt (Run Length Coding)
Loại dư thừa đơn giản nhất trong một tập tin là các đường chạy dài gồm các
kí tự lặp lại, điều này thường thấy trong các tập tin đồ hoạ bitmap, các vùng
dữ liệu hằng của các tập tin chương trình, một số tập tin văn bản
Ví dụ 1.6 Xét chuỗi sau
AAAABBBAABBBBBCCCCCCCCDABCBAAABBBBCCCD
Chuỗi này có thể được mã hoá một cách cô đọng hơn bằng cách thay thế chuỗi kí tự lặp lại bằng một thể hiện duy nhất của kí tự lặp lại cùng với một
Trang 26biến đếm số lần kí tự đó được lặp lại Ta muốn nói rằng chuỗi này gồm bốn chữ A theo sau bởi ba chữ B rồi lại theo sau bởi hai chữ A, rồi lại theo sau bởi năm chữ B Việc nén một chuỗi theo phương pháp này được gọi là mã hoá
độ dài loạt Khi có những loạt dài, việc tiết kiệm có thể là đáng kể Có nhiều cách để thực hiện ý tưởng này, tuỳ thuộc vào các đặc trưng của ứng dụng (Các loạt chạy có khuynh hướng tương đối dài hay không? Có bao nhiêu bit được dùng để mã hoá các kí tự đang được mã?)
Nếu ta biết rằng chuỗi của chúng ta chỉ chứa các chữ cái, thì ta có thể mã hoá biến đếm một cách đơn giản bằng cách xen kẽ các con số với các chữ cái Vì vậy, chuỗi kí tự trên được mã hoá lại như sau
4A3BAA5B8CDABCB3A4B3CD
Ở đây "4A" có nghĩa là "bốn chữ A" Chú ý là không đáng để mã hoá các loạt chạy có độ dài 1 hoặc 2 vì cần đến hai kí tự để mã hoá
Ðối với các tập tin nhị phân, một phiên bản được tinh chế của phương pháp
mã hóa độ dài loạt được dùng để thu được sự tiết kiệm đáng kể Ý tưởng ở đây là lưu lại các độ dài loạt, tận dụng sự kiện các loạt chạy thay đổi giữa 0 và
1 để tránh phải lưu chính các số 0 và 1 đó Ðiều này giả định rằng có một vài loạt chạy ngắn (Ta tiết kiệm các bit trên một loạt chạy chỉ khi độ dài của đường chạy là lớn hơn số bit cần để biễu diễn chính nó trong dạng nhị phân), nhưng khó có phương pháp mã hoá độ dài loạt nào hoạt động thật tốt trừ phi hầu hết các loạt chạy đều dài
Việc mã hoá độ dài loạt cần đến các biễu diễn riêng biệt cho tập tin và cho bản đã được mã hoá của nó, vì vậy nó không thể dùng cho mọi tập tin, điều này có thể hoàn toàn bất lợi, ví dụ, phương pháp nén tập tin kí tự đã được đề nghị ở trên sẽ không dùng được đối với các chuỗi kí tự có chứa số Nếu những kí tự khác được sử dụng để mã hoá các số đếm, thì nó sẽ không làm
Trang 27việc với các chuỗi chứa các kí tự đó Giả sử ta phải mã hoá bất kì kí tự nào từ một bảng chữ cái cố định bằng cách chỉ dùng các kí tự từ bảng chữ cái đó Ðể minh hoạ, giả sử ta phải mã hoá bất kì một chuỗi nào từ một chữ cái đó, ta sẽ giả định rằng ta chỉ có 26 chữ cái trong bảng chữ cái (và cả khoảng trống) để làm việc
1.7.2 Phương pháp mã hóa Huffman
1.7.2.1 Giới thiệu
Giáo sư David A Huffman là một trong những người tiên phong trong lĩnh vực khoa học máy tính Trong suốt cả cuộc đời, Huffman đã có những đóng góp quan trọng cho sự nghiên cứu những trạng thái hữu hạn của máy, các mạch chuyển đổi, … Tuy nhiên David Huffman lại nổi tiếng với lý thuyết phương pháp mã hóa Huffman Phương pháp mã hóa Huffman được sử dụng hầu hết trong các ứng dụng có liên quan đến nén và truyền dữ liệu số như là các máy fax, modem, các mạng máy tính
Với “A method for the construction of minimum - redundancy codes” từ
1952, David A Huffman đã đặt nền móng cho sự phát triển của khối kỹ thuật nén dữ liệu dựa trên mô hình thống kê Kể từ đó cho đến những năm 80 là thời kỳ chiếm ưu thế của các loại mã Huffman khác nhau như: Mã Huffman cải tiến (Modified Huffman codes), mã Huffman cụt (Truncated Huffman codes), mã dịch Huffman (Huffman Shift), mã Huffman động (Dynamic Huffman codes)
Với mục đích giới thiệu một số phương pháp nén dữ liệu, ta sẽ xem xét loại
mã Huffman cơ bản là mã Huffman tĩnh (Static Huffman)
Trang 281.7.2.2 Cơ sở nén dữ liệu của phương pháp mã hóa Huffman
Không phải tất cả các ký tự trong một khung dữ liệu được phát đi xuất hiện với cùng một tần số Chẳng hạn, trong một khung các ký tự thì nhất định sẽ
có một ký tự nào đó xuất hiện thường xuyên hơn các ký tự khác Mã Huffman được xây dựng trên cơ sở khai thác triệt để đặc điểm đó của cây khung dữ liệu Thay vì phải dùng cùng một số bit cố định để biểu diễn các ký tự (ví dụ
mã ASCII), mã hóa Huffman dùng các bản mã với số bit thay đổi: Số bit nhiều hơn biểu diễn các ký tự ít xuất hiện, ngược lại số bit ít hơn biểu diễn các ký tự xuất hiện thường xuyên hơn Như vậy, đây là một kiểu mã hóa dựa trên mô hình thống kê
Muốn lập được bảng mã ta phải phân tích tập hợp ký tự cần phát đi để xác định các kiểu ký tự và tần số xuất hiện tương đối của chúng Dựa vào đó, xây dựng một cây ký hiệu không cân bằng (tức là gồm một số nhánh không dài bằng nhau) Mức độ không cân bằng của cây là do tần số xuất hiện tương đối của các ký tự quyết định Một cây được xác định như vậy được gọi là cây mã Huffman
Cây mã Huffman là một cây nhị phân có các nhánh được gán cho giá trị 0 hoặc 1 Gốc của cây được gọi là nút gốc còn các điểm rẽ của các nhánh được gọi là các nút nhanh, điểm kết thúc của một nhánh được gọi là nút lá Mỗi nút
lá được gán tương ứng với một ký tự cần mã hóa Hình 1.4 là một ví dụ về một cây mã Huffman được xây dựng cho xâu ký tự cần phát đi là AAAABBCD
Từ một nút nhánh, khi rẽ thành hai nhánh mới thì nhánh bên trái được gán cho giá trị 0 và nhanh bên phải được gán cho giá trị 1 Bản mã của một ký tự được xác định đi từ nút gốc đến nút lá tương ứng với ký tự đó Các bit của bản mã được tập hợp từ các giá trị tương ứng của các nhánh phải đi qua
Trang 29Bản mã tương ứng với các ký tự A, B, C, D lần lượt như Bảng 1.2
Rõ ràng, về mặt hình thức phương pháp này có hiệu quả trong trường hợp có một số ký tự xuất hiện nhiều hơn các ký tự khác Tuy nhiên, trong thực tế thì
Trang 30không hẳn như vậy mà để giải được mã ta phải truyền đi cấu trúc cây mã đính kèm với bản mã Do đó trên thực tế kích thước bản mã sẽ lớn hơn nhưng với văn bản đủ dài thì nó vẫn tỏ ra hiệu quả
1.7.2.3 Phương pháp xây dựng cây mã Huffman
Mã Huffman là mã xây dựng trên nền tảng xác suất Khi xây dựng cây mã ta cần quan tâm đến tần xuất xuất hiện của các ký tự trong văn bản Chẳng hạn, trong ví dụ trên A xuất hiện 4 lần, B xuất hiện 2 lần, C xuất hiện 1 lần, D xuất hiện 1 lần
Ta sắp xếp các ký tự theo trật tự giảm dần của tần số xuất hiện của ký tự trong văn bản Mỗi ký tự sẽ được gán cho một nút lá Tần số xuất hiện của một nút được gọi là trọng số của nút Hai nút cuối cùng trong danh sách đã được sắp xếp là C(1) và D(1) hợp thành một nút nhánh có hai nút “con” là một nút 1 (qui ước là nút con bên trái), một nút 0 (qui ước là nút con bên phải) Sau đó gán cho nút nhánh mới tạo làm nút có trọng số nhỏ nhất trong danh sách các nút Công việc này được lặp đi lặp lại cho đến khi nào trong danh sách nút chỉ còn lại một nút, đó chính là nút gốc của cây
Để đưa ra bản mã của một ký tự, chúng ta xuất phát từ nút lá tương ứng với kí
tự đó, và sau đó đi ngược lại theo các nhánh để về nút gốc Khi đi qua một nhánh ta cần tích luỹ lại giá trị của nhánh đó (đó là 0 hoặc 1) Sau khi đến nút gốc và tích luỹ lại các bit 0, 1 tiếp đó ta đảo ngược trật tự các bit, ta được bản
mã của kí tự cần tìm Chẳng hạn với kí tự A xuất phát từ nút lá đi ngược về gốc chỉ qua nhánh 1, do đó bản mã của nó là 1 Đối với kí tự C xuất phát từ nút lá đi về gốc phải đi qua nhánh 1, nhánh 0 và nhánh 0 nên khi đảo ngược bit ta có bản mã tương ứng là 001
Trang 311.7.2.4 Khẳng định mã Huffman là mã
Khi xem xét cây mã Huffman ta thấy mã Huffman là một mã Prefix Nghĩa là không có một bản mã nào ngắn hơn lại là phần đầu của bản mã dài hơn Như vậy mỗi ký tự sẽ được mã hoá bằng một bản mã duy nhất và ngược lại một bản mã chỉ dùng để mã hoá cho một kí tự duy nhất trong văn bản
1.7.2.5 Giải mã theo cây mã Huffman
Vì cây các bản mã có độ dài khác nhau nên khi giải mã luồng bit nhận được từng bit một Các bản mã Huffman có tính chất Prefix, nghĩa là không có bản
mã ngắn hơn nào trùng với phần đầu của bản mã dài hơn Chẳng hạn, ở ví dụ trên ký tự A có bản mã là 1 thí trong các bản mã khác không có bản mã nào bắt đầu bằng 1, Ký tự B có mã là 01 thì các bản mã sau không bản mã nào băt đầu bằng 01 Dựa vào tính chất Prefix, việc giải mã trở nên đơn giản đi rất nhiều Ta chỉ việc xuất phát từ gốc và lần lượt đi theo các nhánh tương ứng với bit đọc được là 0 hay 1 cho đến khi được một nút lá thì đó chính là ký tự giải mã nhận được Lúc đó mã ASCII của ký tự tương ứng của nút lá sẽ được ghi vào bộ đệm của bên thu
Giả sử ta nhận được môt luồng bit là: 1000001011001 Luồng bit này được giải mã như Hình 1.5
Như vậy, bên thu nếu muốn giải mã đúng, thì nó cần phải biết được bộ bản
mã (cấu trúc cây mã) tưong ứng với dữ liệu nhận được Ta có thể thực hiện
1 0 0 0 0 0 1 0 1 1 0 0 1
Hình 1.5 Giải mã theo cây mã Huffman
Trang 32được điều này bằng hai cách: cách 1 là bên phát sẽ truyền đi bộ mã trước khi gửi đi file dữ liệu, cách 2 là bên thu đã có sẵn bộ mã
Cách thứ nhất là một dạng của nén thích ứng, bởi vì bộ mã có thể thay đổi cho phù hợp với dữ liệu cần truyền Nhưng đổi lại cách này làm cho hiệu suất nén
bị giảm đi, do phải truyền đi bảng mã Cách thứ 2 bắt buộc bên thu phải có sẵn nhiều bộ mã khác nhau, khi truyền bên phát sẽ thông báo phải dùng bộ mã nào Cách này có được dựa trên sự phân tích tần suất xuất hiện của một ký tự trong các văn bản của một ngôn ngữ nào đó, ví dụ trong tiếng Anh thì tần suất hiện của chữ e là lớn nhất Do đó người ta có thể xây dựng được bộ bản mã Huffman để truyền các file văn bản viết bằng ngôn ngữ đó
Như vậy mã Huffman tạo ra các bản mã gồm một số nguyên các bit có độ dài ngắn khác nhau Các ký tự có tần xuất hiện càng cao thì sẽ được mã bằng bản
mã có độ dài bit càng ngắn, ngược lại ký tự có tần xuất hiện càng ít thì sẽ được mã hoá bằng bản mã có độ dài bit lớn Mã Huffman có tính chất Prefix điều này cho phép giải mã chính xác một luồng bit nhận được mặc dù độ dài của các bản mã là khác nhau Việc giải mã được thực hiện thông qua một cây nhị phân
1.7.3 Phương pháp nén LZW
Năm 1997 Abraham Lempel và Jacob Ziv công bố thuật toán đầu tiên và lấy tên là LZ77 Năm 1984 thuật toán đã được Terry Welch định nghĩa lại Do đó thuật toán có tên LZW
1.7.3.1 Thuật toán nén
Ý tưởng của thuật toán nén LZW là nén và giải nén dựa trên một bộ từ điển Điều đò có nghĩa là mã hóa dữ liệu bằng việc tham chiếu tới một bộ từ điển (hay một bảng mã) Để mã hóa một ký tự hay một xâu con chỉ cần tham chiếu tới một con số mã đơn tương ứng với ký tự hay xâu con đó trong từ điển
Trang 33Bộ từ điển là một bảng các bản mã, một bản mã là một con số nhị phân 12 bit
Khi LZW bắt đầu mã hóa một file, bảng mã khởi động chỉ chứa 256 lối vào tương ứng với 256 ký tự trong bảng mã ASCII, những lối vào còn lại trống sẵn sàng cho một xâu ký tự mới được mã hóa vào bảng mã Sau đó nó sẽ đọc
dữ liệu từ file input 8 bits một và mã hóa các dữ liệu này như là các con số (bản mã) biểu diễn chỉ số của dữ liệu đó trong bảng Mỗi lần LZW gặp một xâu mới, xâu mới này sẽ được mã hóa thành bản mã trong bảng mã, và mỗi lần gặp một xâu con đã có chỉ số tương ứng trong bảng mã rồi nó sẽ đọc tiếp một ký tự và nối vào xâu đó thành một xâu con mới Quá trình lặp lại cho đến khi hết file
encode s to out file;
add s+ch to dictionary;
s = ch;
}
}
Trang 341.7.3.2 Thuật toán giải nén
Trong thuật toán giải nén, một ưu điểm hơn hẳn các thuật toán khác là không
có từ điển hay các thông tin cần lưu lại, chính từ điển (hay bảng mã) mà ta đã
sử dụng trong thuật toán nén sẽ được cấu trúc lại ngay trong tiến trình giải nén
Khi muốn giải mã một file, đầu tiên đọc lần lượt các chỉ số trong file, tìm kiếm xâu tương ứng trong từ điển và ghi ra file giải mã Ký tự đầu tiên của xâu con này sẽ được nối với xâu đang làm việc hiện tại Xâu nối này sẽ được cho vào bảng mã Xâu này bây giờ sẽ trở thành xâu hiện tại làm việc
Tuy nhiên có ngoại lệ xảy ra, đó là khi LZW đọc được một chỉ số chưa có trong bảng mã Điều này xảy ra khi tồn tại xâu con mà bắt đầu và kết thúc cùng một ký tự Ta sẽ xét một ví dụ cụ thể để hiểu thêm về phần này
NCODE = read in a code;
if (dictionary contains NCODE)
{
entry = translation of NCODE from dictionary;
}
Trang 35ch = first char of entry;
add ((translation of OCODE) + ch) to dictionary;
Trang 36 Bước 1: LZW đọc ký tự a Do là ký tự đơn nên đã tồn tại trong bảng mã
Không có mã được ghi vào file, không có mã được ghi vào bảng mã
Bước 2: LZW đọc ký tự tiếp theo trong xâu vào là b Do ở bước 1 ta
mã Do đó, ta output ký tự đầu của xâu con hiện tại ra file và đẩy xâu hiện tại vào bảng mã
Bước 3: LZW đọc tiếp ký tự a Ký tự này được ghép vào xâu con của
Bước 4: LZW đọc tiếp ký tự b Ký tự này được ghép với xâu con của
ra file và cũng không có xâu mới nào được thêm vào bảng mã
Bước 5: LZW đọc được ký tự a Ký tự này được ghép với xâu con của
do đó ta output mã của ab ra file đồng thời đẩy xâu aba vào bảng mã
do đó không thay đổi gì
Bước 7: LZW đọc được ký tự a , xâu hiện tại là aba đã có trong bảng mã,
do đó không thay đổi gì
Bước 8: LZW đọc được ký tự b Ký tự này được ghép với xâu con của
Bước 7 là aba được xâu hiện tại là abab Xâu này chưa có trong bảng
mã, do đó ta output mã của aba ra file đồng thời đẩy xâu abab vào bảng
mã
Bước 9: Output mã của b ra file Cuối cùng thu được xâu mã
0,1,256,258,1
Trang 37Quá trình giải nén được mô tả trong bảng 1.4
Bước 1: LZW đọc được chỉ số 0, tìm thấy xâu tương ứng trong bảng mã là
a , output ra file giải mã và trở thành xâu làm việc của bước sau
Bước 2: LZW đọc tiếp chỉ số 1, tìm thấy xâu tương ứng trong bảng mã là
b , output ra file giải mã Nối b với xâu hiện tại được xâu ab đẩy vào bảng
mã
Bước 3: LZW đọc được chỉ số 2, tìm thấy xâu tương ứng trong bảng mã là
ab , output ra file giải mã
Bước 4: LZW đọc được chỉ số 4 nhưng không tìm thấy xâu tương ứng
trong từ điển Trong ví dụ này đã xảy ra ngoại lệ khi mà trình giải mã đọc được chỉ số 4 nhưng lại không có trong bảng mã vì đang được xử lý
Nguyên nhân là trong quá trình nén xuất hiện xâu con aba có ký tự đầu
và cuối giống nhau
Trang 38Ngoại lệ được giải quyết bằng cách lấy chính ký tự đầu của xâu con hiện
file giải mã
Bước 5: LZW đọc tiếp chỉ số cuối cùng là 1, tìm thấy xâu tương ứng trong
Kết thúc quá trình giải nén, ta thu được xâu abababab
Nhận xét
Thuật toán LZW sử dụng một bảng mã (từ điển) là các bản mã dài 12 bit, trong khi các ký tự chỉ dài có 8 bit, do đó nếu sử dụng nén một file văn bản ngắn rất có thể file nén có kích thước lớn hơn file gốc Thuật toán chỉ thực sự
có hiệu quả khi có nhiều chuỗi con lặp lại
Trang 39CHƯƠNG II OTOMAT TRONG MÃ HÓA VÀ AN TOÀN THÔNG TIN
Mục đích chính của chương này trình bày một số khái niệm cơ bản về văn phạm Đặc biệt, đưa ra một mô hình mã hóa mới theo cách tiếp cận otomat hữu hạn trong mối liên hệ với các cấu trúc đại số
2.1 Văn phạm và sự phân lớp văn phạm
2.1.1 Định nghĩa văn phạm cấu trúc
Văn phạm cấu trúc G là một hệ thống gồm bốn thành phần xác định như sau
V : Tập hợp các biến hay các ký hiệu chưa kết thúc (non terminal); N
V : Tập hợp các ký hiệu kết thúc (terminal) (với T V N V T ), ký hiệu
: Tập hữu hạn các qui tắc ngữ pháp được gọi là các sản xuất
là các chuỗi (V N V T)*;
Người ta thường dùng các chữ cái Latinh viết hoa (A, B, C, …) để chỉ các ký
Nhận xét
Bằng qui ước này, ta có thể suy ra các biến, các ký hiệu kết thúc và các ký hiệu bắt đầu của văn phạm một cách xác định và duy nhất bằng cách xem xét
Trang 40các luật sản xuất Vì vậy, để biểu diễn văn phạm, một cách đơn giản người ta chỉ cần liệt kê tập các sản xuất của chúng
Từ văn phạm, để sinh ra các câu (từ), ta định nghĩa khái niệm “dẫn xuất” như sau
Nếu chuỗi 1, 2, , m và * 1 2, 23, , m1 m, ta nói m có
hay 1 dẫn xuất ra m, ký hiệu 1* m
Ngôn ngữ sinh bởi văn phạm G (V V N, T, , ) S là tập hợp các chuỗi ký hiệu
2.1.2 Sự phân cấp Chomsky trên văn phạm
Bằng cách áp đặt một số qui tắc hạn chế trên các luật sản xuất, Noam Chomsky đề nghị một hệ thống phân loại các văn phạm dựa trên của các luật sản xuất Ta có bốn lớp văn phạm như sau
Văn phạm loại 0: Một văn phạm gần như không cần thỏa ràng buộc
văn phạm loại 0, hay còn được gọi là văn phạm không hạn chế
(Unrestricted Grammar)
Ngôn ngữ sinh bởi văn phạm này gọi là ngôn ngữ kiểu 0 hay đệ qui kể được