2.3.1 Mục đích nghiên cứu chuẩn AES
Việc phải tính toán trên các số nguyên lớn làm cho tốc độ của thuật toán RSA chậm đáng kể so với các thuật toán mã hóa khóa đối xứng (nhƣ DES, AES) vì lý do này ngƣời ta thƣờng không sử dụng thuật toán RSA để xử lý (mã hóa và giải mã) trực tiếp các thông điệp dài. Thuật toán RSA thƣờng đƣợc sử dụng kết hợp với một thuật toán mã hóa đối xứng. Điển hình nhất, ngƣời ta sử dụng thuật toán mã hóa đối xứng nhƣ DES hay AES để mã hóa trực tiệp thông điệp và sử dụng thuật toán RSA đẻ mã hóa khóa bí mật của DES hay AES.
Ta sẽ sử dụng thuật toán RSA đa nguyên tố kết hợp với AES để xây dựng chƣơng trình ứng dụng. Vì mục đích này, việc nghiên cứu và đƣa vào lý thuyết về chuẩn mã hóa tiên tiến AES là cần thiết.
Hình 2.7: Sơ đồ kết hợp RSA và AES
Plaintext ASE Encryption Ciphertex ASE Decryption Plaintext
ASE key ASE Key
RSA Public key RSAEncryption ASE ASE Key encode RSA Decryption ASE
RSA Private key
Alice Bob
Bob
2.3.2 Tổng quan
AES (viết tắt của Advanced Encryption Standard) là một thuật toán mã hoá đƣợc sử dụng để bảo vệ dữ liệu điện tử, đƣợc chính phủ Hoa Kỳ áp dụng làm tiểu chuẩn mã hóa, thay thế chuẩn DES. AES đƣợc NIST (viện tiêu chuẩn và công nghệ quốc gia của Hoa Kỳ) công bố trong FIPS PUPS 197 (Federal Information Processing Standard Publication 197) ngày 21/11/2001. AES đƣợc thiết kế bởi hai nhà mã hoá học ngƣời Bỉ: Joan Daemen và Vincent Rijmen, lấy tên chung là Rijndael.
Ngƣời ta có cách gọi khác nhau về thuật toán AES: AES – 128, AES – 129, AES – 256, tƣơng ứng chiều dài khóa sử dụng. Hiện nay thuật toán AES - 128 đƣợc sử dụng rộng rãi trong giao dịch điện tử. Phần cài đặt sẽ sử dụng thuật toán AES – 128, nên các phần còn lại của chƣơng chỉ đề cập đến thuật toán AES – 128, khi nói thuật toán AES ngầm hiều là AES – 128;
2.3.3 Các khái niệm cơ sở
2.3.3.1 Input, Output, Key
Input, Output, Key cho thuật toán AES đều là các chuỗi 128 bit (tƣơng ứng 16 byte). Một chuỗi nhƣ thế thƣờng đƣợc gọi là một khối (block), số bit chứa trong một chuỗi đƣợc gọi là chiều dài chuỗi. Các bit trong chuỗi đƣợc đánh số từ 0, bắt đầu từ bit đầu tiên cho tới bit cuối cùng. Nếu i là chỉ số cho bit nào đó trong block 128, thì i nằm trong khoảng: 0 i 128
2.3.3.2 Byte
Đơn vị cơ sở đƣợc xử lý trong thuật toán AES là byte. Input, output, key đều đƣợc xử lý nhƣ mảng một chiều 16 byte. Các byte cũng đƣợc đánh số thứu tự bắt đầu từ 0 cho byte đầu tiên. Nếu n là chỉ số cho một byte nào đó, thì n nằm trong khoảng: 0
n 16. Các mảng 16 byte đƣợc biểu diễn (ký hiệu) dƣới dạng sau: a0a1a2...a15
Mỗi byte là một chuỗi tuần tự 8 bit ta thƣờng biểu diễn một byte nhƣ sau {b7, b6, b5, b4, b3, b2, b1, b0), bi = 0 hoặc 1. Mỗi byte tƣơng ứng với một đa thức nhị phân, với bậc cao không cao hơn 7:
b7x7 + b6x6 + b5x5 + b4x4 + b3x3 + b2x2 + b1x + b0 = 7 0 i i ix b
Theo cách biểu diễn này, ta thấy sự tƣơng ứng này là 1 – 1 giữa các byte trong tập 256 byte và các phần tử của trƣờng hữu hạn GF(28
)
Ví dụ: {01100011} đƣợc biểu diễn dƣới dạng x6 + x5 + x + 1
Có thể sử dụng cơ số 16 (hexadecimal) bằng các chia byte ra hai phần, mỗi phần là 4 bit và mỗi nhóm 4 bit này đƣợc thay thế bằng 1 kí tự. Ví dụ: 01100011 có thể biểu diễn là {63}. Việc thay thế nhóm 4 bit bởi 1 ký tự dựa vào Bảng 2.1:
Bit Pattern Character Bit Pattern Character 0000 0 1000 8 0001 1 1001 9 0010 2 1010 a 0011 3 1011 b 0100 4 1100 c 0101 5 1101 d 0110 6 1110 e 0111 7 1111 f
Bảng 2.1: Thay thế dãy 4 bit sang cơ số 16
Một vài toán tử của trƣờng hữu hạn yêu cầu việc đƣa vào một bit (b8) vào bên trái của một byte – 8bit. Khi có thếm bit mở rộng này thì ta biểu diễn byte – 9bit bằng việc thêm vào {01} trƣớc byte 8 – bit. Ví dụ: {01} {1b}
2.3.3.3 Ma trận trạng thái (State Matrix).
Thuật toán AES bao gồm một tập các toán tử thực thi và làm thay đổi một ma trận hai chiều đƣợc gọi là ma trận trạng thái. Ma trận trạng thái là ma trận cỡ 4x4 chứa 16 byte
Quy trình mã hóa AES nhƣ sau: ban đầu 16 byte của Input đƣợc nạp vào ma trận trạng thái, khi đó ma trận trạng thái đƣợc khởi tạo trạng thái đầu. Tiếp theo là dãy các toán tử thực thi trên ma trận trạng thái, với sự tham gia của khóa mật AES (thực ra là 44 khóa con sinh bởi khóa ban đàu 16 byte, mỗi khó con là một word – 4byte). Kết thúc quá trình, trạng thái cuối của ma trận trạng thái đƣợc nạp vào output. Quy trình giải mã diễn ra ngƣợc lại
Ta giả sử Input = in0, in1, in2,… in15. Khi đó ta có trạng thái khởi đầu ma trận trạng thái:
n0 n4 n8 n12 n1 n5 n9 n13 n2 n6 n10 n14 n3 n7 n11 n15
2.3.3.4 Hộp thay thế S – Box và InvS – Box
S – Box là một bảng 16x16 các byte. Các cột và dòng của S – Box đƣợc đánh số thứ tự 0, 1, … 9, a, b, c, d, e, f.
Đầu vào của S – Box là một byte, giả thiết {x, y} (biểu diễn theo hệ cơ số 16 Hexadecimal) thì đầu ra của S – Box là byte nằm trên dòng x cột y của bảng S – Box
Tƣơng ứng với bảng S – Box có bảng InvS – Box thỏa mãn:
InvS – Box(S – Box(b)) = b, trong đó b là một byte bất kỳ
InvS – Box đƣợc sử dụng cho quá trình giải mã. Dƣới đây là hai bảng S – Box và InvS – Box đƣợc sử dụng:
Hình 2.8: Hộp S –Box sử dụng trong quá trình mã hoá AES [14]
2.3.4 Đặc tả thuật toán
Trong hoạt động mã hóa cũng nhƣ giải mã AES, có 4 toán tử cơ bản đƣợc sử dụng để thao tác trên byte
+ Thay thế các byte sử dụng bảng thay thế S – Box
+ Dịch các dòng của ma trận trạng thái với các đoạn khác nhau trên mỗi dòng + Trộng dữ liệu trong mỗi cột của ma trận trạng thái thay thế S – box + Cộng (XOR) một Round Key với ma trận trạng thái
2.3.4.1 Sinh khóa con
Ban đầu khóa K = k0k1…k15 (16 byte) đƣợc đƣa vào. Từ khóa K sinh ra 44 khóa con W[0], W[1], … W[43], với mỗi khóa còn là một word 4 byte
Quy tắc sinh 44 khóa con nhƣ sau: Với 4 khóa con đầu tiên:
W[0] = k0k1k2k3 W[1] = k4k5k6k7 W[2] = k8k9k10k11 W[3] = k12k13k14k15 Với i = 4 43:
Nếu i mod 4 ≠ 0: W[i] = W[i-4] XOR W[i-1] Nếu i mod 4 = 0;
W[i-4] XOR SubWord(RotWord(W[i-1])) XOR Rcon[i/4]
Trong đó SubWord(x: word) tác động S – Box lên từng byte trong word. RotWord(x: word) thực hiện dịch trái một byte trên x
Rcon[1..10] là bảng các hằng word: Rcon[1..10] =
{ {1, 0, 0, 0}, {2, 0, 0, 0}, {4, 0, 0, 0}, {8, 0, 0, 0}, {16, 0, 0, 0}, {32, 0, 0, 0}, {64, 0, 0, 0}, {128, 0, 0, 0}, {27, 0, 0, 0}, {54, 0, 0, 0} }
2.3.4.2 Hoạt động mã hóa
Sau khi dữ liệu từ Input đƣợc nạp vào ma trận trạng thái, quá trình mã hóa diễn ra dƣới sự tham gia của 4 hàm (toán tử) thao tác và biến đổi ma trận trạng thái:
+ SubBytes(): thay thế tất cả các phần từ (byte) của ma trận trạng thái bằng việc áp dụng S – Box lên phần tử đó
+ ShiftRows(): hoán vị vòng dòng thứ i của ma trận trạng thái về bên trái i bƣớc, mỗi bƣớc dịch 1 byte
+ MixColums(): thực hiện phép nhân ma trận cố định với ma trận trạng thái, trong đó phép nhân ma trận dựa trên các phép toán cộng và nhân byte đã định nghĩa ở trên mục 2.4.3 State = 02 01 01 03 03 02 01 01 01 03 02 01 01 01 03 02 x State
+ AddRoudKey(): Tác động vào ma trận trạng thái 11 vòng (r = 0, 1, …, 10), tại vòng lặp r, 4 khóa con liên tiếp đƣợc sử dụng: W[4r], W[4r + 1], W[4r + 2], W[4r + 3]. Trong đó mỗi khóa con đƣợc xem là một cột bốn byte, đƣợc tạo thành ma trận 4x4, đem ma trận này XOR với ma trận trạng thái làm biến đổi ma trận trạng thái…
Giả mã của hoạt động mã hóa AES:
AES_Encryption(Input, key, Output) Begin State: = Input; r:= 0; AddRoundKey(); For r:=1 to 9 do SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(); endFor r: = 10; SubBytes(); ShiftRows(); AddRoudKey(); Output = State; end;
2.3.4.3 Hoạt động giải mã
Hoạt động giải mã là quá trình ngƣợc lại với hoạt động mã hóa. Tƣơng ứng với 4 hàm sử dụng trong quá trình mã hóa ta có 4 hàm sử dụng trong quá trình giải mã: + InvSubBytes(): Thay thế tất cả phần từ của ma trận trạng thái bằng việc áp dụng InvS – Box lên từng phần đó
+ InvSiftRows(): Hoán vị dòng thứ i của ma trận trạng thái i bƣớc về bên phải, mỗi bƣớc dịch một byte
+ InvMixColumns():Thực hiện phép nhân ma trận cố định (nghịch đảo của ma trận cố định sử dụng trong MixColumns()) với ma trận trạng thái, trong đó phép nhân ma trận cũng dựa trên các phép toán cộng và nhân byte đã định nghĩa ở trên
State = e d b b e d d b e d b e 0 09 0 0 0 0 09 0 0 0 0 09 09 0 0 0 x State
+ Toán tử ngƣợc AddRowKey() là bản thân nó (áp dụng hai lần liên tiếp toán tử này thì ma trận trạng thái không thay đổi
Giả mã hoạt động giải mã AES
AES_Decryption(Input, key, OutPut) Begin State: = Input; r:= 10; AddRoudKey(); InvSiftRows(); InvSubBytes(); For i: = 9 downto 1 do AddRoudKey(); InvMixColumns(); InvSiftRows(); InvSubBytes(); EndFor; r: = 0; AddRowKey(); End;
Chương 3: PHƢƠNG PHÁP NÉN DỮ LIỆU 3.1 TỔNG QUAN VỀ NÉN DỮ LIỆU 3.1.1 Mã nén dữ liệu
3.1.1.1 Nén dữ liệu, bít trung bình
1/. Nén dữ liệu
a/ Khái niệm nén dữ liệu
Nén là một quá trình giảm lƣợng không gian cần thiết để biểu diễn cùng một lƣợng thông tin cho trƣớc. Ngƣời ta còn gọi nén là biến đổi một luồng ký hiệu thành một luồng các từ mã.
Quá trình nén nhƣ sau:
Hình 3.1: Quá trình nén dữ liệu
Trong đó:
Văn bản là văn bản ban đầu cần nén.
Mô hình là tập hợp các chữ cái cùng quy tắc đƣợc sử dụng để xử lý các chữ cái vào và đƣa ra các từ 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 chữ cái và một bộ mã sẽ tạo ra các từ mã dựa trên xác suất đó.
Mã hoá là chỉ quá trình thay thế các chữ cái trong văn bản ban đầu bằng các từ mã tƣơng ứng để đƣa ra bản mã chính xác.
Nhƣ vậy, quá trình nén diễn ra nhƣ sau: quá trình mô hình căn cứ vào văn bản cần nén sẽ tạo ra các từ mã. Sau đó, từ bộ từ mã vừa tạo đƣợc và văn bản ban đầu quá trình nén sẽ đƣa ra bản mã.
Mã hoá và mô hình là hai giai đoạn hoàn toàn khác nhau vì trong giai đoạn mô hình có rất nhiều cách để xử lý các chữ cái của văn bản mà cùng sử dụng một phƣơng pháp xây dựng mã để cho ra các từ mã.
Nếu bản mã có kích thƣớc nhỏ hơn văn bản thì phƣơng pháp nén đó có hiệu quả.
Bản mã Văn bản
Mô hình
Ví dụ
Chúng ta sử dụng cùng phƣơng pháp mã Huffman cho hai mô hình khác nhau: Mô hình 1: dựa trên xác suất độc lập của từng chữ cái xuất hiện bất kì trong văn bản.
Mô hình 2: cần tính đƣợc xác suất phụ thuộc dựa trên những chữ cái nhận đƣợc lúc đó trong văn bản.
Do mô hình khác nhau nên cùng sử dụng mã Huffman để đƣa ra từ mã nhƣng hiệu quả nén của chúng rất khác nhau.
Tuy nhiên, chúng ta vẫn quen dùng từ mã hoá để chỉ cho cả quá trình nén văn bản mặc dù đó chỉ là một giai đoạn của một quá trình nén.
Ngƣời ta thƣờng mã hoá thông qua các từ mã của một bảng chữ cái nào đó. Có thể có nhiều thuật toán nén dữ liệu khác nhau. Mỗi thuật toán có một kiểu dữ liệu nhất định và cùng một số modem có đặc điểm nén thích ứng có nghĩa là chúng có khả năng chọn thuật toán nén thích hợp phụ thuộc vào kiểu dữ liệu cần nén. Trong số các cách mã thì cách nào mã ngắn hơn chúng ta nói là nó nén tốt hơn (so với cách mã khác).
2/. Bít trung bình
Chúng ta thƣờng dùng trình nén để nén các file, tức là các văn bản đƣợc tạo ra từ 256 byte. Nén một file nhiều lần liên tiếp thì đến một lúc nào đó chúng ta cũng sẽ thu đƣợc một file mà trình nén này không thể thu nhỏ lại đƣợc nữa. Bởi vì, nếu không chúng ta sẽ nén đƣợc file ấy xuống thành một file không có bít nào cả.
Từ đó, chúng ta có khẳng định: Với mọi thuật toán mã các file văn bản luôn tồn tại một văn bản mà nó không thể nén đƣợc thành file có dung lƣợng nhỏ hơn.
Từ khẳng định trên suy ra không thể vạch định ra đƣợc một gianh giới rõ ràng giữa một bên là mã hoá và một bên là mã nén. Để đánh giá khả năng nén của một thuật toán chúng ta đƣa ra khái niệm về số bít trung bình cần thiết để ghi lại một chữ cái của văn bản.
3.1.1.2 Mã tổng và mã phân tách 1/. Mã tổng
Định nghĩa. Văn bản tổng
Cho A và B là hai văn bản. Tổng của A + B là một văn bản mới thu đƣợc từ A viết tiếp B vào bên phải của A. Nhƣ vậy độ dài của tổng các văn bản là tổng của các độ dài của chúng.
Hình 3.2: Văn bản tổng
Định nghĩa. Mã tổng
Một mã đƣợc gọi là mã tổng nếu nhƣ bản mã của tổng các văn bản là tổng các bản mã.
Hình 3.3: Mã tổng
Trong định nghĩa cho mã tổng ta đã sử dụng khái niệm “tổng của các văn bản”. Nếu bản mã của văn bản “a” là f(a), của văn bản b là f(b) thì bản mã của “ab” là “f(a)f(b)”, bản mã của “ba” là “f(b)f(a)”.
Xét mã tổng trên bảng chữ cái Σ = {a1, a2, ...., am}. Mỗi chữ cái a1, a2, ..., am có từ mã tƣơng ứng. Từ mã của các chữ cái xác định ánh xạ f : Σ → M, từ tập các chữ cái vào tập các xâu bít “0/1”. Nhƣ vậy với mọi ai Σ, xâu bít f(ai) là từ mã của ai, độ dài xâu bít f(ai) đƣợc ký hiệu là (ai).
Theo định nghĩa mã tổng thì xâu các chữ cái = 1 2... n tƣơng ứng duy nhất với xâu bít có dạng f( ) = f( 1)f( 2)...f( n). Bản mã f( ) có độ dài L( )=
n i i 1 ) ( bit. + = + = 1001010 + 111000 = 1001010111000 b¶n m· v¨n b¶n
2/. Mã phân tách
Từ đây chúng ta chỉ đề cập đến các mã tổng nhị phân. Nếu các từ mã có độ dài cố định thì ta luôn giải mã đƣợc. Nhƣng nếu độ dài của từ mã thay đổi thì không phải với cách mã nào cũng có thể giải mã đƣợc.
Xét cách mã sau: a -> 100
b -> 1000 c -> 0
Bản mã của “ac” và b đều là dãy bít “1000”. Nhƣ vậy khi nhận đƣợc chuỗi bít 1000 chúng ta không thể biết đƣợc rằng văn bản ban đầu là “b” hay là “ac”.
Điều kiện quan trọng của việc tạo mã là cho phép khi nhận đƣợc bản mã, chúng ta phải tách ra đƣợc thành các thành phần cơ bản là các từ mã và cách tách này phải là duy nhất và đúng đắn. Tính phân tách đƣợc đƣa ra dƣới đây sẽ đảm bảo cho điều này.
3.1.2 Định lý Shannon
Cùng một dữ liệu có thể có nhiều cách mã hoá. Trong số các cách mã hoá khác nhau có thể có cách mã hoá mà thu đƣợc bản mã ngắn hơn.
Nén dữ liệu không phải là việc các dữ liệu bị ghi nén lại. Bản chất của các thuật toán nén dữ liệu là ghi lại văn bản (mã hoá lại văn bản) ở dạng khác.