Kiến trỳc của thuật toỏn Rijndael

Một phần của tài liệu Tìm hiểu và xây dựng chương trình mô phỏng mã hoá rijndael (Trang 38)

1. 2 Hệ thống mó húa khúa cụng cộng( mó húa bất đối xứng)

2.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 6 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

Hỡnh 6: Một chu kỳ mó húa của phương phỏp Rijndael (với Nb = 4) 2.4.2.1 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(28). 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à {x7 x6 x5 x4 x3 x2 x1x0}):

Hỡnh 7: 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[8,Nb]) begin for r = 0 to 7 for c = 0 to Nb - 1 state[r,c] = Sbox[state[r,c]] end for end for end

Bảng D.2 thể hiện bảng thay thế nghịch đảo được sử dụng trong phộp biến đổi SubBytes

2.4.2.2 Phộp biến đổi ShiftRows

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 Sr,c tại dũng r cột c sẽ dịch chuyển đến cột (c - shift(r, Nb))mod Nb hay: ' =

,c r

s Sr,(cshift(r,Nb))modNb

Với 0 < r < 8 và 0 ≤ c < Nb

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.

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

2.4.2.3 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(28). Thực hiện phộp nhõn s'(x) = a(x)⊗ s(x) với a(x) = {03}x3 + {01}x2 + {01}x + {02}. Thao tỏc này được thể hiện ở dạng ma trận như sau:

Hỡnh 8: 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(28)) 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

2.4.2.4 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:

[s'0,c , s'1,c , s'2,c , s'3,c ] = [s0,c , s1,c , s2,c , s3,c ]⊕[wround∗Nb+c ] 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 từ trong 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

Hỡnh 9: Thao tỏc AddRoundKey tỏc động lờn mỗi cột của trạng thỏi 2.4.2.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. 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.

Hàm SubWord(W) thực hiện việc thay thế (sử dụng S-box) từng byte thành phần của 4 byte được đưa vào và trả kết quả trả về là một từ bao gồm 4 byte kết quả sau khi thực hiệc việc thay thế.

Hàm RotWord(W) thực hiện việc dịch chuyển xoay vũng 4 byte thành phần (a, b, c, d) của từ được đưa vào. Kết quả trả về của hàm RotWord là một từ gồm 4 byte thành phần là (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 + 1 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 + 1

end while end

Cỏc hằng số của mỗi chu kỳ hoàn toàn độc lập với giỏ trị Nk và được xỏc định bằng Rcon[i] = (RC[i], {00}, {00}, {00}) với RC[i] ∈ GF(28) và thỏa:

RC[1]=1 ({01})

2.4.2.6 Xỏc định khúa của chu kỳ

Khúa của chu kỳ thứ i được xỏc định bao gồm cỏc từ (4 byte) cú chỉ số từ Nb * i đến Nb * (i +1) −1 của bảng mó khúa mở rộng. Như vậy, mó khúa của chu kỳ thứ i bao gồm cỏc phần tử w[Nb* i] , w[Nb* i +1] ,…, w[Nb*(i +1) −1] . Bảng mó khúa mở rộng và cỏch xỏc định mó khúa của chu kỳ (Nb= 6 và Nk = 4) Việc phỏt sinh mó khúa cho cỏc chu kỳ cú thể được thực hiện mà khụng nhất thiết phải sử dụng đến mảng w[Nb*(Nr +1)] . Trong trường hợp dung lượng bộ nhớ hạn chế như ở cỏc thẻ thụng minh, cỏc mó khúa cho từng chu kỳ cú thể được xỏc định khi cần thiết ngay trong quỏ trỡnh xử lý mà chỉ cần sử dụng max(Nk,Nb)* 4 byte trong bộ nhớ.

Bảng khúa mở rộng luụn được tự động phỏt sinh từ khúa chớnh mà khụng cần phải được xỏc định trực tiếp từ người dựng hay chương trỡnh ứng dụng. Việc chọn lựa khúa chớnh (Cipher Key) là hoàn toàn tự do và khụng cú một điều kiện ràng buộc hay hạn chế nào.

2.4.3 Quy trỡnh giải mó

Quy trỡnh giải mó được thực hiện qua cỏc giai đoạn sau:

1. Thực hiện thao tỏc AddRoundKey đầu tiờn trước khi thực hiện cỏc chu kỳ giải mó.

2. Nr −1 chu kỳ giải mó bỡnh thường: mỗi chu kỳ bao gồm bốn bước biến đổi liờn tiếp nhau: InvShiftRows, InvSubBytes, AddRoundKey, InvMixColumns.

3. Thực hiện chu kỳ giải mó cuối cựng. Trong chu kỳ này, thao tỏc InvMixColumns được bỏ qua.

Dưới đõy là mó giả của quy trỡnh giải mó: InvCipher( byte in[4 * Nb],

byte out[4 * Nb],

word w[Nb * (Nr + 1)])

byte state[4,Nb] state = in

AddRoundKey(state, w + Nr * Nb)

for round = Nr - 1 downto 1 InvShiftRows(state) InvSubBytes(state) AddRoundKey(state, w + round * Nb) InvMixColumns(state) end for InvShiftRows(state) InvSubBytes(state) AddRoundKey(state, w) out = state end

2.4.3.1 Phộp biến đổi InvShiftRows

Hỡnh 10. Thao tỏc InvShiftRows tỏc động lờn từng dũng của trạng thỏi hiện hành

InvShiftRows chớnh là phộp biến đổi ngược của phộp biến đổi ShiftRows. Dũng đầu tiờn của trạng thỏi sẽ vẫn được giữ nguyờn trong khỏc ba dũng cuối của trạng thỏi sẽ được dịch chuyển xoay vũng theo chiều ngược với phộp biến đổi ShiftRows với cỏc di số Nb-shift (r, Nb) khỏc nhau. Cỏc byte ở cuối dũng được đưa vũng lờn đầu dũng trong khi cỏc byte cũn lại cú khuynh hướng di chuyển về cuối dũng. c r, ' Nb mod Nb)) shift(r, (c r, S S + = với 0 < r < 4 và 0 ≤ c <Nb

Giỏ trị của 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 . Thao tỏc InvShiftRows được thể hiện qua đoạn mó gió sau:

InvShiftRows(byte state[4,Nb]) begin byte t[Nb] for r = 1 to 3 for c = 0 to Nb - 1 t[(c + h[r,Nb]) mod Nb] = state[r,c] end for for c = 0 to Nb - 1 state[r,c] = t[c] end for end for end

2.4.3.2 Phộp biến đổi InvSubBytes

Phộp biến đổi ngược của thao tỏc SubBytes, ký hiệu là InvSubBytes, sự dụng bảng thay thế nghịch đảo của S-box trờn GF(28), ký hiệu là S-box-1. Quỏ trỡnh thay thế 1 byte y dựa vào S-box-1 bao gồm hai bước sau:

1. Áp dụng phộp biến đổi affine (trờn GF(2)) sau đối với y (cú biểu diễn nhị phõn là {y7 y6 y5 y4 y3 y2 y1y0}):

hay xi = y(i+2)mod8 ⊕ y(i+5)mod8 ⊕ y(i+7)mod 8 ⊕ di , với di là bit thứ i của giỏ trị {05},0 ≤ i ≤ 7. Rừ ràng đõy chớnh là phộp biến đổi affine ngược của phộp biến đổi affine ở bước 1 của S-box.

2. Gọi x là phần tử thuộc GF(28) cú biểu diễn nhị phõn là {x7x6 x5 x4 x3 x2 x1x0}.

Xỏc định phần tử nghịch đảo x-1 ∈ GF(28) với quy ước {00}-1 = {00}

InvSubBytes(byte state[4,Nb]) begin for r = 0 to 3 for c = 0 to Nb - 1 state[r,c] = InvSbox[state[r,c]] end for end for end

Bảng D.2 thể hiện bảng thay thế nghịch đảo được sử dụng trong phộp biến đổi InvSubBytes

2.4.3.3 Phộp biến đổi InvMixColumns

InvMixColumns là biến đổi ngược của phộp biến đổi MixColumns. Mỗi cột của trạng thỏi hiện hành được xem như đa thức s(x) bậc 4 cú cỏc hệ số thuộc GF(28) và được nhõn với đa thức a-1(x) là nghịch đảo của đa thức a(x) (modulo M(x)) được sử dụng trong phộp biến đổi MixColumns.

a-1(x) = {0b}x3 + {0d}x2 + {09}x + {0e}

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(28)) hai phần tử x và y với nhau.

InvMixColumns(byte block[4,Nb]) begin byte t[4] for c = 0 to Nb - 1 for r = 0 to 3 t[r] = block[r,c] end for for r = 0 to 3 block[r,c] = FFmul(0x0e, t[r]) xor

FFmul(0x0b, t[(r + 1) mod 4]) xor FFmul(0x0d, t[(r + 2) mod 4]) xor FFmul(0x09, t[(r + 3) mod 4])

end for end for end

2.4.3.4 Quy trỡnh giải mó tương đương

Nhận xột:

1. Phộp biến đổi InvSubBytes thao tỏc trờn giỏ trị của từng byte riờng biệt của trạng thỏi hiện hành, trong khi phộp biến đổi InvShiftRows chỉ thực hiện thao tỏc di chuyển cỏc byte mà khụng làm thay đổi giỏ trị của chỳng. Do đú, thứ tự của hai phộp biến đổi này trong quy trỡnh mó húa cú thể được đảo ngược.

2. Với phộp biến đổi tuyến tớnh A bất kỳ, ta cú A(x + k) = A(x) + A(k) . Từ đú, suy ra

InvMixColumns(state XOR Round Key)=

InvMixColumns(state) XOR InvMixColumns(Round Key)

Như vậy, thứ tự của phộp biến đổi InvMixColumns và AddRoundKey trong quy trỡnh giải mó cú thể được đảo ngược với điều kiện mỗi từ (4 byte) trong bảng mó khúa mở rộng sử dụng trong giải mó phải được biến đổi bởi InvMixColumns. Do trong chu kỳ mó húa cuối cựng khụng thực hiện thao tỏc MixColumns nờn khụng cần thực hiện thao tỏc InvMixColumns đối với mó khúa của chu kỳ giải mó đầu tiờn cũng như chu kỳ giải mó cuối cựng.

Vậy, quy trỡnh giải mó Rijndael cú thể được thực hiện với trỡnh tự cỏc phộp biến đổi ngược hoàn toàn tương đương với quy trỡnh mó húa.

EqInvCipher(byte in[4*Nb], byte out[4*Nb], word dw[Nb*(Nr+1)])

begin

byte state[4,Nb] state = in

AddRoundKey(state, dw + Nr * Nb)

for round = Nr - 1 downto 1 InvSubBytes(state) InvShiftRows(state) InvMixColumns(state) AddRoundKey(state, dw + round * Nb) end for InvSubBytes(state) InvShiftRows(state) AddRoundKey(state, dw) out = state end

Trong quy trỡnh trờn, bảng mó khúa mở rộng dw được xõy dựng từ bảng mó khúa w bằng cỏch ỏp dụng phộp biến đổi InvMixColumns lờn từng từ (4 byte) trong w, ngoại trừ Nb từ đầu tiờn và cuối cựng của w.

for i = 0 to (Nr + 1) * Nb - 1 dw[i] = w[i] end for for rnd = 1 to Nr - 1 InvMixColumns(dw + rnd * Nb) end for

2.5 Cỏc vấn đề cài đặt thuật toỏn

Gọi a là trạng thỏi khi bắt đầu chu kỳ mó húa. Gọi b, c, d, e lần lượt là trạng thỏi kết quả đầu ra sau khi thực hiện cỏc phộp biến đổi SubBytes, ShiftRows, MixColumns và AddRoundKey trong chu kỳ đang xột. Quy ước: trong trạng thỏi s ( s = a,b, c,d, e ), cột thứ j được kớ hiệu sj, phần tử tại dũng i cột j kớ hiệu là si, j.

Kết hợp cỏc kết quả trung gian của mỗi phộp biến đổi trong cựng chu kỳ với nhau, ta cú:

Cú thể viết lại như sau:

Định nghĩa cỏc bảng tra cứu T0, T1, T2, T3 như sau:

Khi đú, biểu thức trờn sẽ được viết lại như sau:

với round là số thứ tự của chu kỳ đang xột. Như vậy, mỗi cột ej của trạng thỏi kết quả sau khi thực hiện một chu kỳ mó húa cú thể được xỏc định bằng bốn phộp toỏn XOR trờn cỏc số nguyờn 32 bit sử dụng bốn bảng tra cứu T0, T1, T2 và T3. Cụng thức

chỉ ỏp dụng được cho Nr-1 chu kỡ đầu. Do chu kỳ cuối cựng khụng thực hiện phộp biến đổi MixColumns nờn cần xõy dựng 4 bảng tra cứu riờng cho chu kỡ này:

Nhận xột

Kỹ thuật sử dụng bảng tra cứu giỳp cải thiện tốc độ mó húa và giải mó một cỏch đỏng kể. Ngoài ra, kỹ thuật này cũn giỳp chống lại cỏc phương phỏp phỏ mó dựa trờn thời gian mó húa do khi sử dụng bảng tra cứu, thời gian mó húa dữ liệu bất kỳ đều như nhau.

Kỹ thuật này cú thể được sử dụng trong quy trỡnh mó húa và quy trỡnh giải mó tương đương do sự tương ứng giữa cỏc bước thực hiện của hai quy trỡnh này. Khi đú, chỳng ta cú thể dựng chung một quy trỡnh cho việc mó húa và giải mó nhưng sử dụng bảng tra khỏc nhau.

Trờn thực tế, cỏc bảng tra cứu cú thể được lưu trữ sẵn hoặc được xõy dựng trực tiếp dựa trờn bảng thay thế S-Box cựng với thụng tin về cỏc khuụn dạng tương ứng. Trờn cỏc bộ vi xử lý 32-bit, những thao tỏc biến đổi sử dụng trong quy trỡnh mó húa cú thể được tối ưu húa bằng cỏch sử dụng bốn bảng tra cứu, mỗi bảng cú 256 phần tử với kớch thước mỗi phần tử là 4 byte. Với mỗi phần tử a ∈ GF(28), đặt:

Nhận xột:

Ti[a] = RotWord(Ti-1[a]) với i = 1,2,3 . Ký hiệu RotWordi là hàm xử lý gồm i lần thực hiện hàm RotWord, ta cú: Ti[a] = RotWordi(T0[a])

Như vậy, thay vỡ dựng 4 kilobyte để lưu trữ sẵn cả bốn bảng, chỉ cần tốn 1 kilobyte để lưu bảng đầu tiờn, cỏc bảng cũn lại cú thể được phỏt sinh lại khi sử dụng. Cỏc hạn chế về bộ nhớ thường khụng được đặt ra, trừ một số ớt trường hợp như đối với cỏc applet hay servlet. Khi đú, thay vỡ lưu trữ sẵn bảng tra cứu, chỉ cần lưu đoạn mó xử lý phỏt sinh lại cỏc bảng này. Lỳc đú, cụng thức

sẽ trở thành:

2.5.1.1 Kết quả thử nghiệm

Bảng tốc độ xử lý của phương phỏp Rijndael được cỏc nhà đỏnh giỏ thử nghiệm:

Kết quả thử nghiệm thuật toỏn Rijndael được ghi nhận trờn mỏy Pentium 200 MHz (sử dụng hệ điều hành Microsoft Windows 98), mỏy Pentium II 400 MHz, Pentium III 733 MHz (sử dụng hệ điều hành Microsoft Windows 2000 Professional), Pentium IV 2,4GHz (sử dụng hệ điều hành Microsoft Windows XP Service Pack 2).

2.6 Kết luận

2.6.1 Khả năng an toàn

Việc sử dụng cỏc hằng số khỏc nhau ứng với mỗi chu kỳ giỳp hạn chế khả năng tớnh đối xứng trong thuật toỏn. Sự khỏc nhau trong cấu trỳc của việc mó húa và giải mó đó hạn chế được cỏc khúa “yếu” (weak key) như trong phương phỏp DES. Ngoài ra, thụng thường những điểm yếu liờn quan đến mó khúa đều xuất phỏt từ sự phụ thuộc vào giỏ trị cụ thể của mó khúa của cỏc thao tỏc phi tuyến như trong phương phỏp IDEA (International Data Encryption Algorithm). Trong cỏc phiờn bản mở rộng, cỏc khúa được sử dụng thụng qua thao tỏc XOR và tất cả những thao tỏc phi tuyến đều được cố định sẵn trong S-box mà khụng phụ thuộc vào giỏ trị cụ thể của mó khúa Tớnh chất phi tuyến cựng khả năng

khuếch tỏn thụng tin (diffusion) trong việc tạo bảng mó khúa mở rộng làm cho việc phõn tớch mật mó dựa vào cỏc khúa tương đương hay cỏc khúa cú liờn quan trở nờn khụng khả thi. Đối với phương phỏp vi phõn rỳt gọn, việc phõn tớch chủ yếu khai thỏc đặc tớnh tập trung thành vựng (cluster) của cỏc vết vi phõn trong

Một phần của tài liệu Tìm hiểu và xây dựng chương trình mô phỏng mã hoá rijndael (Trang 38)

Tải bản đầy đủ (DOC)

(69 trang)
w