1. Trang chủ
  2. » Công Nghệ Thông Tin

thuật toán mã hóa và ứng dụng phần 2 docx

29 363 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 503,01 KB

Nội dung

Chương 3 50 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: 1. AddRoundKey: cộng (⊕) mã khóa của chu kỳ vào trạng thái hiện hành. Độ dài của mã khóa của chu kỳ bằng với kích thước của trạng thái. 2. SubBytes: thay thế phi tuyến mỗi byte trong trạng thái hiện hành thông qua bảng thay thế (S-box). 3. MixColumns: trộn thông tin của từng cột trong trạng thái hiện hành. Mỗi cột được xử lý độc lập. 4. ShiftRows : dịch chuyển xoay vòng từng dòng của trạng thái hiện hành với di số khác nhau. Mỗi phép biến đổi thao tác trên trạng thái hiện hành S. Kết quả S’ của mỗi phép biến đổi sẽ trở thành đầu vào của phép biến đổi kế tiếp trong quy trình mã hóa. Trước tiên, toàn bộ dữ liệu đầu vào được chép vào mảng trạng thái hiện hành. Sau khi thực hiện thao tác cộng mã khóa đầu tiên, mảng trạng thái sẽ được trải qua Nr = 10, 12 hay 14 chu kỳ biến đổi (tùy thuộc vào độ dài của mã khóa chính cũng như độ dài của khối được xử lý). 1Nr − chu kỳ đầu tiên là các chu kỳ biến đổi bình thường và hoàn toàn tương tự nhau, riêng chu kỳ biến đổi cuối cùng có sự khác biệt so với 1Nr − chu kỳ trước đó. Cuối cùng, nội dung của mảng trạng thái sẽ được chép lại vào mảng chứa dữ liệu đầu ra. Quy trình mã hóa Rijndael được tóm tắt lại như sau: Phương pháp mã hóa Rijndael 51 1. Thực hiện thao tác AddRoundKey đầu tiên trước khi thực hiện các chu kỳ mã hóa. 2. Nr – 1 chu kỳ mã hóa bình thường: mỗi chu kỳ bao gồm bốn bước biến đổi liên tiếp nhau: SubBytes, ShiftRows, MixColumns, và AddRoundKey. 3. Thực hiện chu kỳ mã hóa cuối cùng: trong chu kỳ này thao tác MixColumns được bỏ qua. Trong thuật toán dưới đây, mảng w[] chứa bảng mã khóa mở rộng; mảng in[] và out[] lần lượt chứa dữ liệu vào và kết quả ra của 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 = 1 to Nr – 1 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 Chương 3 52 3.4.2 Kiến trúc của thuật toán Rijndael Thuật toán Rijndael được xây dựng theo kiến trúc SPN sử dụng 16 s-box (kích thước 8 × 8) để thay thế. Trong toàn bộ quy trình mã hóa, thuật toán sử dụng chung bảng thay thế s-box cố định. Phép biến đổi tuyến tính bao gồm 2 bước: hoán vị byte và áp dụng song song bốn khối biến đổi tuyến tính (32 bit) có khả năng khuếch tán cao. Hình 3.2 thể hiện một chu kỳ mã hóa của phương pháp Rijndael. Trên thực tế, trong mỗi chu kỳ mã hóa, khóa củ a chu kỳ được cộng (XOR) sau thao tác biến đổi tuyến tính. Do chúng ta có thực hiện thao tác cộng khóa trước khi thực hiện chu kỳ đầu tiên nên có thể xem thuật toán Rijndael thỏa cấu trúc SPN [29]. Hình 3.2. Một chu kỳ mã hóa của phương pháp Rijndael (với Nb = 4) Phương pháp mã hóa Rijndael 53 3.4.3 Phép biến đổi SubBytes Thao tác biến đổi SubBytes là phép thay thế các byte phi tuyến và tác động một cách độc lập lên từng byte trong trạng thái hiện hành. Bảng thay thế (S-box) có tính khả nghịch và quá trình thay thế 1 byte x dựa vào S-box bao gồm hai bước: 1. Xác định phần tử nghịch đảo x -1 ∈ GF(2 8 ). Quy ước {00} -1 = {00}. 2. Áp dụng phép biến đổi affine (trên GF(2)) đối với x -1 (giả sử x -1 có biểu diễn nhị phân là {} 01234567 xxxxxxxx ): ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ + ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ = ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ 0 1 1 0 0 0 1 1 11111000 01111100 00111110 00011111 10001111 11000111 11100011 11110001 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 x x x x x x x x y y y y y y y y (3.18) hay iiiiiii cxxxxxy ⊕⊕⊕⊕⊕= ++++ 8mod)7(8mod)6(8mod)5(8mod)4( (3.19) với c i là bit thứ i của {63}, 0 ≤ i ≤ 7. Chương 3 54 Hình 3.3. Thao tác SubBytes tác động trên từng byte của trạng thái Bảng D.1 thể hiện bảng thay thế S-box được sử dụng trong phép biến đổi SubBytes ở dạng thập lục phân.  Ví dụ: nếu giá trị {xy} cần thay thế là {53} thì giá trị thay thế S-box ({xy}) được xác định bằng cách lấy giá trị tại dòng 5 cột 3 của Bảng D.1. Như vậy, S-box ( {xy}) = {ed}. Phép biến đổi SubBytes được thể hiện dưới dạng mã giả: SubBytes(byte state[4,Nb]) begin for r = 0 to 3 for c = 0 to Nb - 1 state[r,c] = Sbox[state[r,c]] end for end for end Phương pháp mã hóa Rijndael 55 3.4.4 Phép biến đổi ShiftRows Hình 3.4. Thao tác ShiftRows tác động trên từng dòng của trạng thái Trong thao tác biến đổi ShiftRows, mỗi dòng của trạng thái hiện hành được dịch chuyển xoay vòng đi một số vị trí. Byte ,rc S tại dòng r cột c sẽ dịch chuyển đến cột (c - shift(r, Nb)) mod Nb hay: ()() NbNbrshiftcrcr ss mod,, ' , + = với 0 < r < 8 và 0 ≤ c < Nb (3.20) Giá trị di số shift(r, Nb) phụ thuộc vào chỉ số dòng r và kích thước Nb của khối dữ liệu. Bảng 3.1. Giá trị di số shift(r, Nb) r shift(r, Nb) 1 2 3 4 1 2 3 6 1 2 3 Nb 8 1 3 4 Chương 3 56 Phép biến đổi ShiftRows được thể hiện dưới dạng mã giả: ShiftRows(byte state[4,Nb]) begin byte t[Nb] for r = 1 to 3 for c = 0 to Nb - 1 t[c] = state[r, (c + h[r,Nb]) mod Nb] end for for c = 0 to Nb – 1 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, mỗi cột của trạng thái hiện hành được biểu diễn dưới dạng đa thức s(x) có các hệ số trên GF(2 8 ). Thực hiện phép nhân ( ) ( ) ( ) xsxaxs ⊗=' (3.21) với a(x) = {03}x 3 + {01}x 2 + {01}x + {02} (3.22) Thao tác này được thể hiện ở dạng ma trận như sau: ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ = ⎥ ⎥ ⎥ ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣ ⎡ c c c c c c c c s s s s s s s s ,3 ,2 ,1 ,0 ' ,3 ' ,2 ' ,1 ' ,0 02010103 03020101 01030201 01010302 (3.23) Phương pháp mã hóa Rijndael 57 Hình 3.5. Thao tác MixColumns tác động lên mỗi cột của trạng thái Trong đoạn mã chương trình dưới đây, hàm FFmul(x, y) thực hiện phép nhân (trên trường GF(2 8 )) hai phần tử x và y với nhau MixColumns(byte state[4,Nb]) begin byte t[4] for c = 0 to Nb – 1 for r = 0 to 3 t[r] = state[r,c] end for for r = 0 to 3 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 Chương 3 58 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, mỗi chu kỳ có một mã khóa riêng (Round Key) có cùng kích thước với khối dữ liệu đang được xử lý và được phát sinh từ mã khóa chính (Cipher Key) cho trước ban đầu. Mã khóa của chu kỳ cũng được biểu diễn bằng một ma trận gồm 4 dòng và Nb cột. Mỗi cột của trạng thái hiện hành được XOR với cột tương ứng của mã khóa của chu kỳ đang xét: ] [],,,[]',',','[ ,3,2,1,0,3,2,1,0 cNbroundcccccccc wssssssss +∗ ⊕= , (3.24) với 0 ≤ c < Nb. Thao tác biến đổi ngược của AddRoundKey cũng chính là thao tác AddRoundKey. Trong đoạn chương trình dưới đây, hàm xbyte(r, w) thực hiện việc lấy byte thứ r trong từ w. AddRoundKey(byte state[4,Nb], word rk[]) // rk = w + round * Nb begin for c = 0 to Nb – 1 for r = 0 to 3 state[r,c] = state[r,c] xor xbyte(r, rk[c]) end for end for end Phương pháp mã hóa Rijndael 59 Hình 3.6. Thao tác AddRoundKey tác động lên mỗi cột của trạng thái 3.5 Phát sinh khóa của mỗi chu kỳ Các khóa của mỗi chu kỳ (RoundKey) được phát sinh từ khóa chính. Quy trình phát sinh khóa cho mỗi chu kỳ gồm 2 giai đoạn:: 1. Mở rộng khóa chính thành bảng khóa mở rộng, 2. Chọn khóa cho mỗi 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 là mảng 1 chiều chứa các từ (có độ dài 4 byte), được ký hiệu là 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 là phụ thuộc vào độ dài của mã khóa chính. [...]... 3 .2 Tc x lý ca phng phỏp Rijndael Kớch thc (bit) Khúa 128 1 92 256 Khi 128 128 128 Pentium 20 0 MHz C++ 69.4 58.0 50.1 C 70.5 59.8 51.3 Tc x lý (Mbit/giõy) Pentium II Pentium III 400 MHz 733 MHz C++ 138.0 116 .2 101 .2 C 141.5 119.7 101.5 C++ 25 2.9 21 2.9 185.5 C 25 9 .2 219.3 186.1 Pentium IV 2. 4 GHz C++ 863.0 726 .5 633.5 C 884.7 748.3 634.9 Kt qu th nghim thut toỏn Rijndael c ghi nhn trờn mỏy Pentium 20 0... cú th vit li nh sau: e0, j 02 e 1, j = 01 e2, j 01 e3, j 03 S [a0, j [0] ] k0, j 03 01 01 S a1, j [1] k 02 03 01 1, j 01 02 03 S a2, j [ 2] k2, j 01 01 02 k a3, j 3 3, j S [ ] (3.36) Khai trin phộp nhõn ma trn, ta cú: e0, j 02 03 01 01 k0, j e 01 02 03 01 k 1, j = S a S a1, j 1 S a2, j 2 S a3, j 3 1, j... j b2, j S [a 2, j ] b3, j S [a 3, j ] (3.31) Sau bin i ShiftRows: b0, j c 0, j c b 1, j = 1,( j + shift (1, Nb )) mod Nb c 2 , j b 2 ,( j + shift (2 , Nb )) mod Nb c 3, j b3 ,( j + shift (3, Nb )) mod Nb (3. 32) Sau bin i MixColumns: d 0, j 02 d 1, j = 01 d 2, j 01 d 3, j 03 (3.33) 03 01 01 c0, j 02 03 01 c1, j 01 02 03 c 2, j 01 01 02 c3,... j e 2 , j d 2 , j k 2 , j e3, j d 3, j k 3, j (3.34) Kt hp cỏc kt qu trung gian ca mi phộp bin i trong cựng chu k vi nhau, ta cú: e0, j 02 e 1, j = 01 e2, j 01 e3, j 03 S [ a 0, j ] 03 01 01 S a 02 03 01 1,( j + shift (1, Nb ))mod Nb 01 02 03 S a 2, ( j + shift (2, Nb ))mod Nb 01 01 02 S a3,( j + shift (3, Nb )) mod Nb [ [ [ k 0, j k 1, j k 2, j... [ ] 02 [ ] 03 k 2, j e2, j e3, j 03 01 01 02 k3, j (3.37) 70 Phng phỏp mó húa Rijndael nh ngha cỏc bng tra cu T0, T1, T2, T3 nh sau: S [a ] 02 S[a ] 03 S [a ] , T [a ] = S[a ] 02 , T0 [a ] = 1 S [a ] S[a ] S [a ] 03 S[a ] S [a ] S [a ] S [a ] 03 , T [a ] = S [a ] T2 [a ] = S [a ] 02 3 S [a ] 03 S [a ] S [a ] 02 (3.38)... kớch thc khúa v kớch thc khi c x lý Cỏc phiờn bn m rng 25 6/384/5 12- bit v phiờn bn m rng 5 12/ 768/1 024 -bit ca thut toỏn Rijndael c trỡnh by di õy c chỳng tụi xõy dng trờn cựng c s lý thuyt ca thut toỏn nguyờn thy v cú kh nng x lý cỏc khúa v khi d liu ln hn nhiu ln so vi phiờn bn gc 4 .2 Phiờn bn m rng 25 6/384/5 12- bit Trong thut toỏn m rng 25 6/384/5 12- bit ca phng phỏp Rijndael, mi t gm cú Nw=8 byte Mi trng... 1 0 1 0 0 y 6 0 1 0 0 1 0 1 0 y 7 0 (3 .27 ) hay xi = y (i + 2 ) mod 8 y (i +5) mod 8 y ( i + 7) mod 8 d i , vi di l bit th i ca giỏ tr {05},0 i 7 (3 .28 ) Rừ rng õy chớnh l phộp bin i affine ngc ca phộp bin i affine bc 1 ca S-box 2 Gi x l phn t thuc GF (28 ) cú biu din nh phõn l {x7 x6 x5 x4 x3 x2 x1 x0 } Xỏc nh phn t nghch o x-1 GF (28 ) vi quy c {00}-1 = {00} InvSubBytes(byte state[4,Nb])... Trờn cỏc b vi x lý 32- bit, nhng thao tỏc bin i s dng trong quy trỡnh mó húa cú th c ti u húa bng cỏch s dng bn bng tra cu, mi bng cú 25 6 phn t vi kớch thc mi phn t l 4 byte Vi mi phn t a GF (28 ), t: S [a ] 02 S[a ] 03 S [a ] , T [a ] = S[a ] 02 , T0 [a ] = S [a ] 1 S[a ] S [a ] 03 S[a ] S [a ] S [a ] S [a ] 03 , T [a ] = S [a ] T2 [a ] = S [a ] 02 3 S [a ] 03 ... {00}, {00}, {00}) vi RC[i] GF (28 ) v tha: RC[1]=1 ({01}) RC[i] =x ({ 02} )(RC[i-1]) = x(i1) 3.5 .2 (3 .25 ) Xỏc nh khúa ca chu k Khúa ca chu k th i c xỏc nh bao gm cỏc t (4 byte) cú ch s t Nb * i n Nb * (i + 1) 1 ca bng mó khúa m rng Nh vy, mó khúa ca chu k th i bao gm cỏc phn 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 w 12 w13 w14 w15 w16 w17 Maừ khoựa... o ca S-box trờn GF (28 ), ký hiu l S-box-1 Quỏ trỡnh thay th 1 byte y da vo S-box-1 bao gm hai bc sau: 1 p dng phộp bin i affine (trờn GF (2) ) sau i vi y (cú biu din nh phõn l {y7 y 6 y5 y 4 y3 y 2 y1 y 0 } ): 64 Phng phỏp mó húa Rijndael x 0 0 x 1 1 x 2 0 x3 = 1 x 4 0 x 5 0 x 1 6 x 7 0 0 1 0 0 1 0 1 y 0 1 0 0 1 0 0 1 0 y1 0 1 0 0 1 0 0 1 y 2 1 0 1 0 0 1 . MixColumns được bỏ qua. Trong thuật toán dưới đây, mảng w[] chứa bảng mã khóa mở rộng; mảng in[] và out[] lần lượt chứa dữ liệu vào và kết quả ra của thuật toán mã hóa. Cipher( byte in[4 * Nb],. 3 52 3.4 .2 Kiến trúc của thuật toán Rijndael Thuật toán Rijndael được xây dựng theo kiến trúc SPN sử dụng 16 s-box (kích thước 8 × 8) để thay thế. Trong toàn bộ quy trình mã hóa, thuật toán. 50 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: 1. AddRoundKey: cộng (⊕) mã khóa của chu kỳ vào trạng thái hiện hành. Độ dài của mã khóa của chu kỳ bằng

Ngày đăng: 24/07/2014, 23:21