Chương 2 : Các phương pháp mã hoá và bảo mật thông tin
2.3 Mã hoá thông tin theo luồng và mã hoá thông tin theo khố
tin theo khối (Stream and Block Ciphers)
Có hai phương pháp chính được sử dụng trong các thuật toán mã hoá đối xứng là mã hoá theo luồng thông tin và mã hoá theo khối [2]. Mã hoá thông tin theo khối làm việc với các khối dữ liệu plaintext và ciphertext còn mã hoá theo luồng làm việc với luồng dữ liệu plaintext và ciphertext, theo từng bit hoặc từng byte.
2.3.1 Mã hoá theo khối
Khi sử dụng thuật toán mã hoá theo khối để mã hoá và giải mã, thông tin được chia thành từng khối theo đơn vị bit. Các khối thông tin này sau đó được đưa vào mã hoá thông qua các phép gán (substitution), chuyển vị (transsposition) và các hàm toán học khác [2]. Thuật toán sẽ gọi tất cả các hàm phải thực hiện trên khối dữ liệu, kiểm tra khoá mã rồi xác định thứ tự thực hiện các hàm.
Phương pháp mã hoá theo khối có hai thuộc tính là: hỗn loạn và khuếch tán. Thuật toán sử dụng các giá trị khoá mã khác nhau không thể đoán trước được tạo ra sự hỗn loạn, bên cạnh đó thuật toán còn chèn thêm các bit ngẫu nhiên vào dữ liệu và biến đổi qua rất nhiều hàm toán học khác nhau nên các giá trị bit trong plaintext bị phân tán.
Hình 2.5 minh hoạ một thuật toán mã hoá theo khối đơn giản với 16 đường vào, mỗi đường vào ứng với 1 bit [4]. Thuật toán này gồm hai lớp các hộp S-box 4 bit. Mỗi hộp S-box này chứa một bảng tra cứu dùng để chỉ dẫn cách mà các bit được dịch chuyển hoặc hoán vị. Khoá mã được sử dụng trong quá trình mã hoá dùng để ra lệnh S-box nào được sử dụng và sử dụng theo thứ tự nào.
Hình 2.5: Trong thuật toán mã hoá block cipher, dữ liệu được chia thành từng khối bit, các hàm toán học được thực hiện trên các khối này
Mỗi một S-box có thể có những hàm toán học, công thức và các phương pháp khác nhau khi thao tác trên từng bit riêng lẻ. Khoá mã tạo ra sự hỗn loạn bởi vì kẻ tấn công không thể biết được S-box nào sẽ được sử dụng trong quá trình mã hoá và tất cả các phép hoán vị trên các bit là khuếch tán bởi vì các bit được dịch chuyển giữa các S-box khác nhau và được đưa vào trong các quá trình xáo trộn thông tin.
Trong ví dụ này chỉ có hai hàng S-box thực hiện việc mã hoá dữ liệu. Đây là một ví dụ rất đơn giản. Phần lớn các thuật toán mã hoá theo khối làm việc với các khối dữ liệu 64 bits và có rất nhiều S-box tham gia vào quá trình mã hoá. Bên cạnh đó, hệ thống mã theo khối sử dụng các giá trị khoá mã ngẫu nhiên nên kẻ tấn công rất khó có thể xác định S-box nào được sử dụng.
2.3.2 Mã hoá theo luồng dữ liệu (Stream Cipher)
Như đã đề cập ở trên, thuật toán mã hoá theo khối tiến hành thực hiện các hàm toán học trên các khối dữ liệu. Thuật toán mã hoá theo luồng thông tin (stream cipher) không chia thông tin thành từng khối như vậy mà coi thông tin là một luồng các bit hoặc byte và tiến hành thực hiện các phép toán trên các bit hoặc byte đó.
Trong thuật toán mã hoá theo luồng, tại mỗi lần mã hoá khác nhau, các bit hoặc byte có thể được biến đổi thành giá trị khác nhau. Một số thuật toán sử dụng bộ tạo chuỗi khoá (keystream generator) để tạo ra các chuỗi bit và so sánh tuyệt đối (XOR) với các bit dữ liệu plaintext để tạo ra thông tin mã hoá. Hình 2.6 bên dưới minh hoạ quá trình này [4].
Hình 2.6: Giá đầu ra của bộ tạo chuỗi khoá được so sánh tuyệt đối với các bit của dữ liệu plaintext
Nếu hệ thống mã hoá chỉ đơn thuần phụ thuộc vào bộ tạo chuỗi khoá thì kẻ tấn công có thể copy thông tin dưới dạng plaintext đem so sánh tuyệt đối với thông tin mã hóa thu được để tìm ra chuỗi khoá và từ đó giải mã các thông tin khác. Do đó cần phải bổ sung thêm khoá mã cho thuật toán.
Trong thuật toán mã hoá thông tin theo khối, nhiêm vụ của khoá mã là xác định hàm nào sẽ được sử dụng và sử dụng theo tuần tự nào. Có nghĩa khoá mã làm nhiệm vụ cung cấp tính ngẫu nhiên cho tiến trình mã hoá. Như đã đề cập ở trên, phần lớn các thuật toán đều được công khai do đó mọi người đều có thể nắm được nguyên lý làm việc của thuật toán. Điều bí mật ở đây chính là khoá mã. Trong hệ
thống mã hoá thông tin theo luồng, khoá mã cũng làm nhiệm vụ cung cấp tính ngẫu nhiên, nhưng áp dụng cho chuỗi khoá làm việc với luồng thông tin. Khoá mã là một giá ngẫu nhiên được đưa vào thuật toán để tạo ra một chuỗi mã, đảm bảo tính ngẫu nhiên của chuỗi mã được tạo ra. Hình 2.7 bên dưới minh hoạ quá trình này.
Hình 2.7: Khoá mã dùng để tạo ra các chuỗi khoá ngẫu nhiên trong quá trình mã hoá và giải mã
Độ an toàn và tính hiệu quả của thuật toán mã hoá thông tin theo luồng gồm các đặc tính:
- Chu kỳ dài, không có sự lặp lại về kiểu trong giá trị chuỗi khoá - Chuỗi khoá không quan hệ tuyến tính với khoá mã
- Không thể dự đoán thống kê (do số lượng bit 0 luôn tương đương bit 1) Do thuật toán mã hoá theo luồng thực hiện việc mã hoá và giải mã lần lượt từng bit theo thời gian nên thuật toán này rất phù hợp để phát triển các phần cứng [6]. Thuật toán mã hoá thông tin theo khối thường phù hợp với việc triển khai ứng dụng cho phần mềm hơn bởi vì thuật toán này làm việc với các khối dữ liệu - cách mà các phần mềm thường làm (thông thường các khối có độ lớn bằng độ rộng của bus dữ liệu - 64 bit) [4].
2.4 Một số thuật toán mã hoá đối xứng đƣợc công khai phổ biến
Hiện nay có rất nhiều thuật toán mã hoá đối xứng được sử dụng công khai, các thuật toán này có những cơ chế khác nhau để cung cấp khả năng mã hoá và giải mã.
2.4.1 Data Encryption Standard (DES)
Data Encryption Standard (DES) là một thuật toán có bề dày lịch sử rất phong phú trong lĩnh vực máy tính. Trong những năm 1960, Viện tiêu chuẩn và công nghệ quốc gia Hoa kỳ (NIST) nghiên cứu nhu cầu bảo vệ hệ thống máy tính và khởi xướng một chương trình mã hoá vào đầu những năm 1970. NIST mời các đối tác đề xuất các kỹ thuật mã hoá dữ liệu nhằm xây dựng một tiêu chuẩn mã hoá phổ biến. Thời điểm đó, IBM đã phát triển một thuật toán mã hoá dùng để bảo vệ các giao dịch tài chính. Năm 1974, thuật toán mã hoá sử dụng khoá mã 128 bit của IBM có tên Lucifer được đệ trình và được chấp thuận. Có rất nhiều tranh cãi xung quanh vấn đề đưa thuật toán Lucifer vào sử dụng, nhưng cuối cùng, năm 1977 Lucifer cũng trở thành một chuẩn mã hoá quốc gia Hoa kỳ và trở thành một chuẩn ANSI vào năm 1978 [6].
DES là thuật toán mã hoá hiện đại đầu tiên dùng trong thương mại đã công khai toàn bộ mọi chi tiết thực hiện bên trong. DES được phát triển phần lớn trong các sản phẩm thương mại và trong phần lớn các cơ quan chính phủ. Thuật toán DES đã được kiểm tra và được công nhận là một trong những thuật toán mạnh nhất và hiệu quả nhất. Việc không tiếp tục hỗ trợ thuật toán DES cũng là nguyên nhân gây ra nhiều tranh cãi nhất khi vào năm 1986, NSA thông báo kể từ tháng 1 năm 1988 tất cả các cơ quan chính phủ không được sử dụng thuật toán nữa, và các sản phẩm dựa trên DES sẽ không còn đáp ứng tiêu chuẩn 1027 trong bộ tiêu chuẩn của Liên bang Hoa kỳ. NSA cho rằng thuật toán DES đã quá phổ biến trong một thời gian dài nên nó chắc chắn là mục tiêu tấn công và trở nên vô ích nếu sử dụng như một tiêu chuẩn chính thức. Rất nhiều nhà nghiên cứu không tán thành nhưng NSA muốn có một tiêu chuẩn mới hơn, an toàn hơn và ít phổ biến hơn.
Quyết định của NSA gây ra rất nhiều tranh cãi và phản ứng tiêu cực bởi vì tại thời điểm đó, DES vẫn cung cấp các tính năng bảo mật cần thiết, các máy tính tại thời điểm đó cần hàng nghìn năm mới phá mã được; ngoài ra DES đã được tích hợp vào trong hàng nghìn sản phẩm và chưa có thuật toán nào thay thế cho DES. NSA cân nhắc lại quyết định của mình và NIST quyết định tiếp tục chấp nhận DES thêm năm năm nữa.
Năm 1998, hãng Electronic Frontier Foundation chế tạo một hệ thống máy tính trị giá 250,000 đô la và phá mã DES trong vòng ba ngày [6]. Chiếc máy tính đó gồm 1,536 bộ vi xử lý chạy ở tốc độ 40MHz, mỗi bộ vi xử lý có thể thực hiện 60 triệu phép giải mã trong vòng 1 giây. Mặc dù hầu hết mọi người không thể có những hệ thống máy tính như vậy để phá mã DES, nhưng khi định luật Moore thành sự thật, sức mạnh của bộ vi xử lý tăng lên thì các kẻ tấn công có khả năng tài chính ở mức trung bình cũng có thể phá mã DES. Điều này làm cho thuật toán 3DES ra đời. Thuật toán 3DES mạnh hơn bằng cách thực hiện mã hoá, giải mã rồi lại mã hoá thông tin với các khoá mã khác nhau.
Sau này tiêu chuẩn mã hoá DES đã được NIST thay thế bằng tiêu chuẩn Advanced Encryption Standard (AES) với thuật toán Rijndael. Điều này có nghĩa là Rijndael là một thuật toán mới được phê chuẩn để mã hoá các thông tin nhạy cảm (chưa phải là bí mật) của Chính phủ Mỹ và thuật toán này sẽ dần được chấp thuận sử dụng công khai, rộng rãi.
Cơ chế hoạt động của DES [4]
Thiết kế của DES liên quan tới hai khái niệm đó là: Product cipher và Feistel cipher. Cả hai bao gồm việc lặp đi lặp lại một dãy các thao tác.
Ý tưởng cơ bản của một product cipher là xây dựng một hàm mã hoá phức tạp bằng cách kết hợp vài giải thuật đơn giản bổ sung các thiếu sót lẫn nhau. Các giải thuật cơ bản bao gồm: các phương pháp hoán vị, tịnh tiến (ví dụ như XOR) các phép ánh xạ tuyến tính, các biến đổi số học, nhân modun, các phép thay thế đơn giản.
Một Product cipher là sự kết hợp hai hay nhiều hơn các phép biến đổi nhằm mục đích có được một phép mã hoá an toàn hơn.
Một mạng thay thế-hoán vị (substitutation-permutation network hay SP network) là một product cipher bao gồm một số các tầng, mỗi tầng bao gồm các thay thế và hoán vị
Nhiều mạng thay thế-hoán vị là các phép mã hoá lặp theo định nghĩa: Một mã hoá theo khối lặp là một mã hoá theo khối bao hàm việc lặp lại có thứ tự một hàm nội tại gọi là hàm vòng. Các tham số bao gồm số vòng lặp, kích thước khối n được tính
bằng bit, kích thước k từ đó rút ra r khoá con Ki….
Hình 2.8: Một mạng thay thế
Một Feistel cipher là một mã hoá lặp, ánh xạ một tài liệu gốc 2t bit (L0,R0) với các khối t bit L0, R0 thành một văn bản được mã hoá (Rr,Lr) qua 1 quá trình r vòng trong đó r1. Với 1ir, vòng thứ i ánh xạ (Li1,Ri1)Ki (Li,Ri) như sau:
1
i
i R
L , Ri Li1 f(Ri1,Ki) trong đó mỗi khoá con Ki được rút ra từ khoá mã K. Theo chuẩn của Feistel cipher, r3 và thường là số chẵn [4]. Cấu trúc của Feistel bắt buộc mã hoá đầu ra là (Rr,Lr) chứ không phải là (Lr,Rr); các khối được đổi chỗ ban đầu của chúng sau vòng cuối cùng. Việc giải mã vì vậy cũng sử dụng 1 quá trình r vòng nhưng với các khoá con Ki theo thứ tự ngược lại, từ Kr đến K1. Hàm f
trong Feistel cipher có thể là một product cipher, mặc dù f không nhất thiết phải là khả đảo để cho phép đảo nghịch trong mã hoá Feistel.
DES là một giải thuật mã hoá đối xứng sử dụng phương pháp mã hoá thông tin theo khối. Một khối thông tin plaintext 64 bit đi vào sẽ tạo ra một khối thông tin ciphertext 64 bit. Giải thuật DES sử dụng một khoá mã 64 bit trong đó 56 bit là các khoá mã thật còn 8 bit (các bit 8, 16, …, 64) là bit kiểm tra chẵn lẻ.
Khi tiến hành mã hoá dữ liệu, DES chia dữ liệu thành các khối 64 bit và tiến hành thao tác lần lượt từng khối. Mỗi khối được chia làm 32 bit thấp và 32 bit cao, rồi được đưa qua 16 vòng thực hiện các hàm hoán vị, thay thế. Thứ tự thực hiện các hàm hoán vị, thay thế phụ thuộc vào giá trị khoá mã đưa vào thuật toán.
Hình 2.9: Sơ đồ khối thực hiện giải thuật DES
Các thuật toán mã hoá theo khối có các chế độ điều khiển mã hoá khác nhau. Các chế độ này sẽ xác định cách thức làm việc của thuật toán. Mỗi chế độ có các đặc tính khác nhau và làm việc tốt trong một môi trường với các chức năng nhất định. Điều này rất quan trọng khi triển khai hệ thống mã hoá DES.
DES có bốn chế độ hoạt động cơ bản được sử dụng trong các hoàn cảnh khác nhau và cho những kết quả khác nhau.
Chế độ Electronic Code Book (ECB)
cuốn sổ chứa các ký hiệu điện tín (code book). Khi một khối dữ liệu 64 bit và khoá mã được đưa vào thuật toán sẽ tạo ra một khối ciphertext. Với cùng một khối dữ liệu đưa vào và với cùng một giá trị khoá mã, giải thuật DES làm việc trong chế độ ECB luôn cho ra các ciphertext giống nhau. Không phải khối dữ liệu nào cũng có đầy đủ 64 bit, do đó ECB phải kết hợp với bộ đệm (padding) chèn thêm các bit vô nghĩa để tạo ra các khối thông tin 64 bit. Chế độ hoạt động này thường làm việc với dữ liệu có kích thước nhỏ như để mã hoá và bảo vệ các khoá mã.
Mỗi một khoá mã có một code book riêng. Code book cung cấp quy tắc tiến hành các phép thay thế và hoán vị thực hiện trên khối dữ liệu plaintext. Do chế độ ECB làm việc độc lập với các khối dữ liệu khác nhau nên dữ liệu trong một file không cần phải mã hoá theo một trật tự xác định. Điều này rất hữu ích khi mã hoá các cơ sở dữ liệu. Một cơ sở dữ liệu chứa rất nhiều các phân mảnh dữ liệu do đó nếu được mã hoá theo chế độ ECB, tất cả các bản ghi, bảng biểu có thể được thêm vào, mã hoá, giải mã và xoá bỏ mà không hề ảnh hưởng đến các bản ghi và bảng biểu khác. Các chế độ hoạt động khác của DES phụ thuộc vào thông tin được mã hoá trước đó nên rất khó có thể mã hoá và giải mã các khối thông tin nhỏ bởi vì trước tiên cần phải giải mã các khối thông tin kế trước. Chế độ mã hoá ECB này cũng được dùng trong một số ứng dụng kiểu challenge-response và trong một số ứng dụng quản ký khoá mã. Chế độ mã hoá ECB cũng được dùng để mã hoá mã số cá nhân (PIN) trong các hệ thống rút tiền tự động (ATM) của các ngân hàng.
Chế độ Cipher Block Chaining (CBC)
Trong chế độ ECB, mỗi khối dữ liệu plaintext và khóa mã luôn trả về một giá trị ciphertext duy nhất. Điều đó có nghĩa nếu từ “balloon” được mã hoá thành “hwicssn” thì mã hoá tại thời điểm bất kỳ thời điểm nào với cùng khoá mã ấy kết quả không bao giờ thay đổi. Điều này có nghĩa là chế độ ECB mã hoá theo một khuôn mẫu định sẵn và nếu kẻ tấn công cố gắng thì có thể sẽ tìm hiểu được tiến trình mã hoá. Chế độ mã hoá CBC không tuân theo một khuôn mẫu định sẵn do các khối thông tin, khoá mã và giá trị đầu ra luôn phụ thuộc vào các đầu ra của khối kề trước trong thuật toán; và giá trị thu được cũng được dùng để mã hoá khối tiếp theo. Cơ chế này cho phép kết quả thu được bởi quá trình mã hoá ngẫu nhiên hơn.