Khoảng những năm 1970, tiến sĩ Horst Feistel đã đặt nền móng đầu tiên cho chuẩn mã hóa dữ liệu DES với phương pháp mã hóa Feistel Cipher. Vào năm 1976 Cơ quan Bảo mật Quốc gia Hoa Kỳ (NSA) đã công nhận DES dựa trên phương pháp Feistel là chuẩn mã hóa dữ liệu [25]. Kích thước khóa của DES ban đầu là 128 bit nhưng tại bản công bố FIPS kích thước khóa được rút xuống còn 56 bit.
Một số phương pháp mã hóa quy ước 2.9 Phương pháp DES (Data Encryption Standard) 2.9.1 Phương pháp DES Khoảng năm 1970, tiến sĩ Horst Feistel đặt móng cho chuẩn mã hóa liệu DES với phương pháp mã hóa Feistel Cipher Vào năm 1976 Cơ quan Bảo mật Quốc gia Hoa Kỳ (NSA) công nhận DES dựa phương pháp Feistel chuẩn mã hóa liệu [25] Kích thước khóa DES ban đầu 128 bit công bố FIPS kích thước khóa rút xuống cịn 56 bit Trong phương pháp DES, kích thước khối 64 bit DES thực mã hóa liệu qua 16 vịng lặp mã hóa, vịng sử dụng khóa chu kỳ 48 bit tạo từ khóa ban đầu có độ dài 56 bit DES sử dụng bảng số S-box để thao tác Q trình mã hóa DES tóm tắt sau: Biểu diễn thông điệp nguồn x ∈ P dãy 64bit Khóa k có 56 bit Thực mã hóa theo ba giai đoạn: Tạo dãy 64 bit x0 cách hoán vị x theo hoán vị IP (Initial Permutation) Biểu diễn x0 = IP ( x) = L0 R0 , L0 gồm 32 bit bên trái x0, R0 gồm 32 bit bên phải x0 33 Chương L0 R0 x0 Hình 2.2 Biểu diễn dãy 64 bit x thành thành phần L R Thực 16 vòng lặp từ 64 bit thu 56 bit khoá k (chỉ sử dụng 48 bit khố k vịng lặp) 64 bit kết thu qua vòng lặp đầu vào cho vòng lặp sau Các cặp từ 32 bit Li, Ri (với ≤ i ≤ 16 ) xác định theo quy tắc sau: Li = Ri −1 Ri = Li −1 ⊕ f ( Ri −1 , K i ) (2.5) với ⊕ biểu diễn phép toán XOR hai dãy bit, K1, K2, , K16 dãy 48 bit phát sinh từ khóa K cho trước (Trên thực tế, khóa Ki phát sinh cách hốn vị bit khóa K cho trước) Áp dụng hoán vị ngược IP −1 dãy bit R16 L16 , thu từ y gồm 64 bit Như vậy, y = IP −1 ( R16 L16 ) Hàm f sử dụng bước hàm có gồm hai tham số: Tham số thứ A dãy 32 bit, tham số thứ hai J dãy 48 bit Kết hàm f dãy 32 bit Các bước xử lý hàm f ( A, J ) sau: Tham số thứ A (32 bit) mở rộng thành dãy 48 bit hàm mở rộng E Kết hàm E ( A) dãy 48 bit phát sinh từ A cách hốn vị 34 Một số phương pháp mã hóa quy ước theo thứ tự định 32 bit A, có 16 bit A lặp lại hai lần E ( A) Li-1 Ri-1 f Ki ⊕ Li Ri Hình 2.3 Quy trình phát sinh dãy Li Ri từ dãy Li −1 Ri −1 khóa K i Thực phép tốn XOR cho hai dãy 48 bit E ( A) J, ta thu dãy 48 bit B Biểu diễn B thành nhóm bit sau: B = B1 B2 B3 B4 B5 B6 B7 B8 Sử dụng tám ma trận S1 , S , , S8 , ma trận Si có kích thước × 16 dòng ma trận nhận đủ 16 giá trị từ đến 15 Xét dãy gồm bit B j = b1b2 b3b4 b5 b6 , S j ( B j ) xác định giá trị phần tử dòng r cột c Sj, đó, số dịng r có biểu diễn nhị phân b1b6 , số cột c có biểu diễn nhị phân b2 b3b4 b5 Bằng cách này, ta xác định dãy bit C j = S j (Bj ) , ≤ j ≤ 35 Chương Tập hợp dãy bit Cj lại, ta có dãy 32 bit C = C1C2 C3C4 C5C6C7 C8 Dãy 32 bit thu cách hoán vị C theo quy luật P định kết hàm F ( A, J ) Quá trình giải mã thực theo thứ tự đảo ngược thao tác q trình mã hóa 2.9.2 Nhận xét Do tốc độ tính tốn máy tính ngày tăng cao DES quan tâm ý nhà khoa học lẫn người phá mã (cryptanalyst) nên DES nhanh chóng trở nên khơng an toàn Năm 1997, dự án tiến hành bẻ khóa DES chưa đến ngày với chi phí thấp 250.000 dollars Và vào năm 1999, mạng máy tính gồm 100.000 máy giải mã thư tín mã hóa DES chưa đầy 24 Trong q trình tìm kiếm thuật tốn an tồn DES, Tripple DES đời biến thể DES Tripple DES thực ba lần thuật toán DES với khố khác với trình tự khác Trình tự thực phổ biến EDE (Encrypt – Decrypt – Encrypt), thực xen kẽ mã hóa với giải mã (lưu ý khóa giai đoạn thực khác nhau) 36 Một số phương pháp mã hóa quy ước 2.10 Phương pháp chuẩn mã hóa nâng cao AES Để tìm kiếm phương pháp mã hóa quy ước với độ an tồn cao DES, NIST cơng bố chuẩn mã hóa mới, thay cho chuẩn DES Thuật toán đại diện cho chuẩn mã hóa nâng cao AES (Advanced Encryption Standard) thuật tốn mã hóa khóa quy ước, sử dụng miễn phí tồn giới Chuẩn AES bao gồm yêu cầu sau [23]: o Thuật toán mã hóa theo khối 128 bit o Chiều dài khóa 128 bit, 192 bit 256 bit o Khơng có khóa yếu o Hiệu hệ thống Intel Pentium Pro phần cứng phần mềm khác o Thiết kế dễ dàng (hỗ trợ chiều dài khóa linh hoạt, triển khai ứng dụng rộng rãi ứng dụng khác nhau) o Thiết kế đơn giản: phân tích đánh giá cài đặt dễ dàng o Chấp nhận chiều dài khóa lên đến 256 bit o Mã hóa liệu thấp 500 chu kỳ đồng hồ cho khối Intel Pentium, Pentium Pro Pentium II phiên tối ưu thuật tốn o Có khả thiết lập khóa 128 bit (cho tốc độ mã hóa tối ưu) nhỏ thời gian địi hỏi để mã hóa khối 32 bit Pentium, Pentium Pro Pentium II o Khơng chứa phép tốn làm giảm khả vi xử lý bit, 16 bit, 32 bit 64 bit o Không bao hàm phần tử làm giảm khả phần cứng o Thời gian mã hóa liệu thấp 10/1000 giây vi xử lý bit o Có thể thực vi xử lý bit với 64 byte nhớ RAM 37 Chương Sau thực hai lần tuyển chọn, có năm thuật tốn vào vịng chung kết, gồm có: MARS, RC6, SERPENT, TWOFISH RIJNDAEL Các thuật toán đạt yêu cầu AES nên gọi chung thuật toán ứng viên AES Các thuật toán ứng viên AES có độ an tồn cao, chi phí thực thấp Chi tiết thuật tốn trình bày Chương - Phương pháp mã hóa Rijndael Chương - Các thuật toán ứng cử viên AES 38 Phương pháp mã hóa Rijndael Chương Phương pháp mã hóa Rijndael " Nội dung chương trình bày chi tiết phương pháp mã hóa Rijndael hai tác giả Vincent Rijmen Joan Daeman Đây giải thuật Viện Tiêu chuẩn Công nghệ Hoa Kỳ (NIST) thức chọn làm chuẩn mã hóa nâng cao (AES) từ ngày 02 tháng 10 năm 2000 3.1 Giới thiệu Với tốc độ khả xử lý ngày nâng cao vi xử lý nay, phương pháp mã hóa chuẩn (Data Encryption Standard – DES) trở nên khơng an tồn bảo mật thơng tin Do đó, Viện Tiêu chuẩn Công nghệ Hoa Kỳ (National Institute of Standards and Technology – NIST) định chọn chuẩn mã hóa với độ an toàn cao nhằm phục vụ nhu cầu bảo mật thơng tin liên lạc Chính phủ Hoa Kỳ ứng dụng dân Thuật toán Rijndael Vincent Rijmen Joan Daeman thức chọn trở thành chuẩn mã hóa nâng cao AES (Advanced Encryption Standard) từ ngày 02 tháng 10 năm 2000 39 Chương Phương pháp mã hóa Rijndael phương pháp mã hóa theo khối (block cipher) có kích thước khối mã khóa thay đổi linh hoạt với giá trị 128, 192 hay 256 bit Phương pháp thích hợp ứng dụng nhiều hệ thống khác từ thẻ thông minh máy tính cá nhân 3.2 Tham số, ký hiệu, thuật ngữ hàm AddRoundKey Phép biến đổi sử dụng mã hóa giải mã, thực việc cộng mã khóa chu kỳ vào trạng thái hành Độ dài mã khóa chu kỳ với kích thước trạng thái SubBytes Phép biến đổi sử dụng mã hóa, thực hành việc thay phi tuyến byte trạng thái hành thông qua bảng thay (S-box) InvSubBytes Phép biến đổi sử dụng giải mã Đây phép biến đổi ngược phép biến đổi SubBytes MixColumns Phép biến đổi sử dụng mã hóa, thực thao tác trộn thơng tin cột trạng thái hành Mỗi cột xử lý độc lập InvMixColumns Phép biến đổi sử dụng giải mã Đây phép biến đổi ngược phép biến đổi MixColumns 40 Phương pháp mã hóa Rijndael ShiftRows Phép biến đổi sử dụng mã hóa, thực việc dịch chuyển xoay vòng dòng trạng thái hành với di số tương ứng khác InvShiftRows Phép biến đổi sử dụng giải mã Đây phép biến đổi ngược phép biến đổi ShiftRows Nw Số lượng byte đơn vị liệu “từ” Trong thuật toán Rijndael, thuật toán mở rộng 256/384/512 bit thuật toán mở rộng 512/768/1024 bit, giá trị Nw 4, 16 K Khóa Nb Số lượng cột (số lượng từ 8×Nw bit) trạng thái Giá trị Nb = 4, 6, hay Chuẩn AES giới hạn lại giá trị Nb = Nk Số lượng từ (8×Nw bit) khóa Giá trị Nk = 4, 6, hay Nr Số lượng chu kỳ, phụ thuộc vào giá trị Nk and Nb theo công thức: Nr = max (Nb, Nk)+6 41 Chương RotWord Hàm sử dụng q trình mở rộng mã khóa, thực thao tác dịch chuyển xoay vòng Nw byte thành phần từ SubWord Hàm sử dụng trình mở rộng mã khóa Nhận vào từ (Nw byte), áp dụng phép thay dựa vào S-box byte thành phần trả từ gồm Nw byte thành phần thay XOR Phép toán Exclusive-OR ⊕ Phép toán Exclusive-OR ⊗ Phép nhân hai đa thức (mỗi đa thức có bậc < Nw) modulo cho đa thức xNw + • 3.3 Phép nhân trường hữu hạn Một số khái niệm toán học Đơn vị thơng tin xử lý thuật tốn Rijndael byte Mỗi byte xem phần tử trường Galois GF(28) trang bị phép cộng (ký hiệu ⊕) phép nhân (ký hiệu •) Mỗi byte biểu diễn nhiều cách khác 42 Phương pháp mã hóa Rijndael 3.4 Phương pháp Rijndael Phương pháp mã hóa Rijndael bao gồm nhiều bước biến đổi thực tuần tự, kết đầu bước biến đổi trước đầu vào bước biến đổi Kết trung gian bước biến đổi gọi trạng thái (state) Một trạng thái biểu diễn dạng ma trận gồm dòng Nb cột với Nb với độ dài khối chia cho 32 Mã khóa (Cipher Key) biểu diễn dạng ma trận gồm dòng Nk cột với Nk với độ dài khóa chia cho 32 Trong số tình huống, ma trận biểu diễn trạng thái hay mã khóa khảo sát mảng chiều chứa phần tử có độ dài byte, phần tử tương ứng với cột ma trận Số lượng chu kỳ, ký hiệu Nr, phụ thuộc vào giá trị Nb Nk theo công thức: Nr = max{Nb, Nk } + a 0,0 a 0,1 a0,2 a0,3 a0,4 a0,5 k0,0 k0,1 k0,2 k0,3 a 1,0 a 1,1 a1,2 a1,3 a1,4 a1,5 k1,0 k1,1 k1,2 k1,3 a 2,0 a 2,1 a2,2 a2,3 a2,4 a2,5 k2,0 k2,1 k2,2 k2,3 a 3,0 a 3,1 a3,2 a3,3 a3,4 a3,5 k3,0 k3,1 k3,2 k3,3 Hình 3.1 Biểu diễn dạng ma trận trạng thái (Nb = 6) mã khóa (Nk = 4) 49 Chương 3.4.1 Quy trình mã hóa Quy trình mã hóa Rijndael sử dụng bốn phép biến đổi chính: AddRoundKey: cộng (⊕) mã khóa chu kỳ vào trạng thái hành Độ dài mã khóa chu kỳ với kích thước trạng thái SubBytes: thay phi tuyến byte trạng thái hành thông qua bảng thay (S-box) MixColumns: trộn thông tin cột trạng thái hành Mỗi cột xử lý độc lập ShiftRows: dịch chuyển xoay vòng dòng trạng thái hành với di số khác Mỗi phép biến đổi thao tác trạng thái hành S Kết S’ phép biến đổi trở thành đầu vào phép biến đổi quy trình mã hóa Trước tiên, toàn liệu đầu vào chép vào mảng trạng thái hành Sau thực thao tác cộng mã khóa đầu tiên, mảng trạng thái trải qua Nr = 10, 12 hay 14 chu kỳ biến đổi (tùy thuộc vào độ dài mã khóa độ dài khối xử lý) Nr − chu kỳ chu kỳ biến đổi bình thường hồn tồn tương tự nhau, riêng chu kỳ biến đổi cuối có khác biệt so với Nr − chu kỳ trước Cuối cùng, nội dung mảng trạng thái chép lại vào mảng chứa liệu đầu Quy trình mã hóa Rijndael tóm tắt lại sau: 50 Phương pháp mã hóa Rijndael Thực thao tác AddRoundKey trước thực chu kỳ mã hóa Nr – chu kỳ mã hóa bình thường: chu kỳ bao gồm bốn bước biến đổi liên tiếp nhau: SubBytes, ShiftRows, MixColumns, AddRoundKey Thực chu kỳ mã hóa cuối cùng: chu kỳ thao tác MixColumns bỏ qua Trong thuật toán đây, mảng w[] chứa bảng mã khóa mở rộng; mảng in[] out[] chứa liệu vào kết thuật toán mã hóa Cipher( byte in[4 * Nb], byte out[4 * Nb], word w[Nb * (Nr + 1)]) begin byte state[4,Nb] state = in AddRoundKey(state, w) // Xem phần 3.4.6 for round = to Nr – SubBytes(state) // Xem phần 3.4.2 ShiftRows(state) // Xem phần 3.4.4 MixColumns(state) // Xem phần 3.4.5 AddRoundKey(state, w + round * Nb) end for SubBytes(state) ShiftRows(state) AddRoundKey(state, w + Nr * Nb) out = state end 51 Chương 3.4.2 Kiến trúc thuật toán Rijndael Thuật toán Rijndael xây dựng theo kiến trúc SPN sử dụng 16 s-box (kích thước × 8) để thay Trong tồn quy trình mã hóa, thuật tốn sử dụng chung bảng thay s-box cố định Phép biến đổi tuyến tính bao gồm bước: hoán vị byte áp dụng song song bốn khối biến đổi tuyến tính (32 bit) có khả khuếch tán cao Hình 3.2 thể chu kỳ mã hóa phương pháp Rijndael Trên thực tế, chu kỳ mã hóa, khóa chu kỳ cộng (XOR) sau thao tác biến đổi tuyến tính Do có thực thao tác cộng khóa trước thực chu kỳ nên xem thuật tốn Rijndael thỏa cấu trúc SPN [29] Hình 3.2 Một chu kỳ mã hóa phương pháp Rijndael (với Nb = 4) 52 Phương pháp mã hóa Rijndael 3.4.3 Phép biến đổi SubBytes Thao tác biến đổi SubBytes phép thay byte phi tuyến tác động cách độc lập lên byte trạng thái hành Bảng thay (S-box) có tính khả nghịch trình thay byte x dựa vào S-box bao gồm hai bước: Xác định phần tử nghịch đảo x-1 ∈ GF(28) Quy ước {00}-1 = {00} Áp dụng phép biến đổi affine (trên GF(2)) x-1 (giả sử x-1 có biểu diễn nhị phân {x7 x6 x5 x4 x3 x2 x1 x0 } ): ⎡ y ⎤ ⎡1 0 ⎢y ⎥ ⎢ ⎢ ⎥ ⎢1 0 ⎢ y ⎥ ⎢1 1 ⎢ ⎥ ⎢ ⎢ y ⎥ = ⎢1 1 ⎢ y ⎥ ⎢1 1 ⎢ ⎥ ⎢ ⎢ y ⎥ ⎢0 1 ⎢ y ⎥ ⎢0 1 ⎢ 6⎥ ⎢ ⎢⎣ y ⎥⎦ ⎢⎣0 0 1 1 1⎤ ⎡ x ⎤ ⎡1⎤ ⎢ ⎥ 1 ⎥⎥ ⎢ x1 ⎥ ⎢⎢1⎥⎥ 0 1 ⎥ ⎢ x ⎥ ⎢0 ⎥ ⎥⎢ ⎥ ⎢ ⎥ 0 ⎥ ⎢ x ⎥ ⎢0 ⎥ + 0 ⎥ ⎢ x ⎥ ⎢0 ⎥ ⎥⎢ ⎥ ⎢ ⎥ 1 0⎥ ⎢ x5 ⎥ ⎢1⎥ 1 0⎥ ⎢ x ⎥ ⎢1⎥ ⎥⎢ ⎥ ⎢ ⎥ 1 1 ⎥⎦ ⎢⎣ x7 ⎥⎦ ⎢⎣0⎥⎦ (3.18) hay yi = xi ⊕ x(i +4) mod ⊕ x(i +5) mod ⊕ x(i +6) mod ⊕ x (i +7) mod ⊕ ci (3.19) với ci bit thứ i {63}, ≤ i ≤ 53 Chương Hình 3.3 Thao tác SubBytes tác động byte trạng thái Bảng D.1 thể bảng thay S-box sử dụng phép biến đổi SubBytes dạng thập lục phân Ví dụ: giá trị {xy} cần thay {53} giá trị thay S-box ({xy}) xác định cách lấy giá trị dòng cột Bảng D.1 Như vậy, S-box ({xy}) = {ed} Phép biến đổi SubBytes thể dạng mã giả: SubBytes(byte state[4,Nb]) begin for r = to for c = to Nb - state[r,c] = Sbox[state[r,c]] end for end for end 54 Phương pháp mã hóa Rijndael 3.4.4 Phép biến đổi ShiftRows Hình 3.4 Thao tác ShiftRows tác động dòng trạng thái Trong thao tác biến đổi ShiftRows, dòng trạng thái hành dịch chuyển xoay vòng số vị trí Byte S r , c dịng r cột c dịch chuyển đến cột (c - shift(r, Nb)) mod Nb hay: sr' ,c = sr ,(c + shift (r , Nb ))mod Nb với < r < ≤ c < Nb (3.20) Giá trị di số shift(r, Nb) phụ thuộc vào số dịng r kích thước Nb khối liệu Bảng 3.1 Giá trị di số shift(r, Nb) shift(r, Nb) Nb 1 1 r 2 3 3 55 Chương Phép biến đổi ShiftRows thể dạng mã giả: ShiftRows(byte state[4,Nb]) begin byte t[Nb] for r = to for c = to Nb - t[c] = state[r, (c + h[r,Nb]) mod Nb] end for for c = to Nb – state[r,c] = t[c] end for end for end 3.4.5 Phép biến đổi MixColumns Trong thao tác biến đổi MixColumns, cột trạng thái hành biểu diễn dạng đa thức s(x) có hệ số GF(28) Thực phép nhân s ' (x ) = a (x ) ⊗ s(x ) (3.21) a(x) = {03}x3 + {01}x2 + {01}x + {02} (3.22) với Thao tác thể dạng ma trận sau: ⎡ s 0' ,c ⎤ ⎡02 ⎢ ' ⎥ ⎢ ⎢ s1,c ⎥ = ⎢ 01 ⎢ s ' ⎥ ⎢ 01 ⎢ 2' ,c ⎥ ⎢ ⎣⎢ s3,c ⎦⎥ ⎣03 56 03 01 01⎤ ⎡ s0,c ⎤ ⎥⎢ ⎥ 02 03 01⎥ ⎢ s1,c ⎥ 01 02 03⎥ ⎢ s 2,c ⎥ ⎥⎢ ⎥ 01 01 02⎦ ⎣⎢ s3,c ⎦⎥ (3.23) Phương pháp mã hóa Rijndael Hình 3.5 Thao tác MixColumns tác động lên cột trạng thái Trong đoạn mã chương trình đây, hàm FFmul(x, y) thực phép nhân (trên trường GF(28)) hai phần tử x y với MixColumns(byte state[4,Nb]) begin byte t[4] for c = to Nb – for r = to t[r] = state[r,c] end for for r = to state[r,c] = FFmul(0x02, t[r]) xor FFmul(0x03, t[(r + 1) mod 4]) xor t[(r + 2) mod 4] xor t[(r + 3) mod 4] end for end for end 57 Chương 3.4.6 Thao tác AddRoundKey Phương pháp Rijndael bao gồm nhiều chu kỳ mã hóa liên tiếp nhau, chu kỳ có mã khóa riêng (Round Key) có kích thước với khối liệu xử lý phát sinh từ mã khóa (Cipher Key) cho trước ban đầu Mã khóa chu kỳ biểu diễn ma trận gồm dòng Nb cột Mỗi cột trạng thái hành XOR với cột tương ứng mã khóa chu kỳ xét: [ s ' 0,c , s '1,c , s ' 2,c , s '3,c ] = [ s 0,c , s1,c , s 2,c , s 3,c ] ⊕ [ wround ∗Nb +c ] , (3.24) với ≤ c < Nb Thao tác biến đổi ngược AddRoundKey thao tác AddRoundKey Trong đoạn chương trình đây, hàm xbyte(r, w) thực việc lấy byte thứ r từ w AddRoundKey(byte state[4,Nb], word rk[]) // rk = w + round * Nb begin for c = to Nb – for r = to state[r,c] = state[r,c] xor xbyte(r, rk[c]) end for end for end 58 Phương pháp mã hóa Rijndael Hình 3.6 Thao tác AddRoundKey tác động lên cột trạng thái 3.5 Phát sinh khóa chu kỳ Các khóa chu kỳ (RoundKey) phát sinh từ khóa Quy trình phát sinh khóa cho chu kỳ gồm giai đoạn:: Mở rộng khóa thành bảng khóa mở rộng, Chọn khóa cho chu kỳ từ bảng khóa mở rộng 3.5.1 Xây dựng bảng khóa mở rộng Bảng khóa mở rộng mảng chiều chứa từ (có độ dài byte), ký hiệu w[Nb*(Nr + 1)] Hàm phát sinh bảng khóa mở rộng phụ thuộc vào giá trị Nk, tức phụ thuộc vào độ dài mã khóa 59 Chương Hàm SubWord(W) thực việc thay (sử dụng S-box) byte thành phần từ byte đưa vào trả kết từ bao gồm byte kết sau thực hiệc việc thay Hàm RotWord(W) thực việc dịch chuyển xoay vòng byte thành phần (a, b, c, d) từ đưa vào Kết trả hàm RotWord từ gồm byte thành phần (b, c, d, a) KeyExpansion(byte key[4 * Nk], word w[Nb * (Nr + 1)], Nk) begin i=0 while (i < Nk) w[i] = word[key[4*i],key[4*i+1], key[4*i+2],key[4*i+3]] i = i + end while i = Nk while (i < Nb * (Nr + 1)) word temp = w[i - 1] if (i mod Nk = 0) then temp = SubWord(RotWord(temp)) xor Rcon[i / Nk] else if (Nk = 8) and (i mod Nk = 4) then temp = SubWord(temp) end if w[i] = w[i - Nk] xor temp i = i + end while end 60 Phương pháp mã hóa Rijndael Các số chu kỳ hoàn toàn độc lập với giá trị Nk xác định Rcon[i] = (RC[i], {00}, {00}, {00}) với RC[i] ∈ GF(28) thỏa: RC[1]=1 ({01}) RC[i] =x ({02})•(RC[i-1]) = x(i–1) 3.5.2 (3.25) Xác định khóa chu kỳ Khóa chu kỳ thứ i xác định bao gồm từ (4 byte) có số từ Nb * i đến Nb * (i + 1) − bảng mã khóa mở rộng Như vậy, mã khóa chu kỳ thứ i bao gồm phần tử w[ Nb * i ] , w[ Nb * i + 1] ,…, w[ Nb * (i + 1) − 1] w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15 w16 w17 Maõ khóa chu kỳ Mã khóa chu kỳ Mã khóa chu kỳ Hình 3.7 Bảng mã khóa mở rộng cách xác định mã khóa chu kỳ (Nb = Nk = 4) Việc phát sinh mã khóa cho chu mà không thiết phải sử dụng đến mảng w[ Nb * ( Nr + 1)] Trong trường hợp dung lượng nhớ hạn chế thẻ thơng minh, mã khóa cho chu kỳ xác định cần thiết trình xử lý mà cần sử dụng max( Nk , Nb) * byte nhớ Bảng khóa mở rộng ln tự động phát sinh từ khóa mà khơng cần phải xác định trực tiếp từ người dùng hay chương trình ứng dụng Việc 61 Chương chọn lựa khóa (Cipher Key) hồn tồn tự khơng có điều kiện ràng buộc hay hạn chế 3.6 Quy trình giải mã Quy trình giải mã thực qua giai đoạn sau: Thực thao tác AddRoundKey trước thực chu kỳ giải mã Nr − chu kỳ giải mã bình thường: chu kỳ bao gồm bốn bước biến đổi liên tiếp nhau: InvShiftRows, InvSubBytes, AddRoundKey, InvMixColumns Thực chu kỳ giải mã cuối Trong chu kỳ này, InvMixColumns bỏ qua Dưới mã giả quy trình giải mã: InvCipher( byte in[4 * Nb], byte out[4 * Nb], word w[Nb * (Nr + 1)]) begin byte state[4,Nb] state = in AddRoundKey(state, w + Nr * Nb) // Xem phần 3.4.6 for round = Nr - downto InvShiftRows(state) // Xem phần 3.6.1 InvSubBytes(state) // Xem phần 3.6.2 AddRoundKey(state, w + round * Nb) InvMixColumns(state) end for 62 // Xem phần 3.6.3 thao tác Phương pháp mã hóa Rijndael InvShiftRows(state) InvSubBytes(state) AddRoundKey(state, w) out = state end 3.6.1 Phép biến đổi InvShiftRows Hình 3.8 Thao tác InvShiftRows tác động lên dòng trạng thái hành InvShiftRows phép biến đổi ngược phép biến đổi ShiftRows Dòng trạng thái giữ nguyên khác ba dòng cuối trạng thái dịch chuyển xoay vòng theo chiều ngược với phép biến đổi ShiftRows với di số Nb–shift (r, Nb) khác Các byte cuối dòng đưa vòng lên đầu dòng byte cịn lại có khuynh hướng di chuyển cuối dòng s r' ,( c + shift ( r , Nb )) mod Nb = s r ,c với < r < ≤ c < Nb (3.26) 63 ... k0,1 k0 ,2 k0,3 a 1,0 a 1,1 a1 ,2 a1,3 a1,4 a1,5 k1,0 k1,1 k1 ,2 k1,3 a 2, 0 a 2, 1 a2 ,2 a2,3 a2,4 a2,5 k2,0 k2,1 k2 ,2 k2,3 a 3,0 a 3,1 a3 ,2 a3,3 a3,4 a3,5 k3,0 k3,1 k3 ,2 k3,3 Hình 3.1 Biểu diễn dạng... w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w 12 w13 w14 w15 w16 w17 Mã khóa chu kỳ Mã khóa chu kỳ Mã khóa chu kỳ Hình 3.7 Bảng mã khóa mở rộng cách xác định mã khóa chu kỳ (Nb = Nk = 4) Việc phát sinh mã. .. bao gồm yêu cầu sau [23 ]: o Thuật tốn mã hóa theo khối 128 bit o Chiều dài khóa 128 bit, 1 92 bit 25 6 bit o Khơng có khóa yếu o Hiệu hệ thống Intel Pentium Pro phần cứng phần mềm khác o Thiết