Một số khỏi niệm toỏn học

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 33)

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

2.3Một số khỏi niệm toỏn học

Đơn vị thụng tin được xử lý trong thuật toỏn Rijndael là byte. Mỗi byte xem như một phần tử của trường Galois GF(28) được trang bị phộp cộng (ký

hiệu ⊕) và phộp nhõn (ký hiệu •). Mỗi byte cú thể được biểu diễn bằng nhiều cỏch khỏc nhau: dạng nhị phõn ({b7 b6 b5 b4 b3 b2 b1 b0}), dạng thập lục phõn ({h1h0}) hay dạng đa thức cú cỏc hệ số nhị phõn i i ix b ∑ = 7 0 2.3.1 Phộp cộng

Phộp cộng hai phần tử trờn GF(28) được thực hiện bằng cỏch “cộng” (thực chất là phộp toỏn XOR, ký hiệu ⊕) cỏc hệ số của cỏc đơn thức đồng dạng của hai đa thức tương ứng với hai toỏn hạng đang xột. Như vậy, phộp cộng và phộp trừ hai phần tử bất kỳ trờn GF(28) là hoàn toàn tương đương nhau.

Nếu biểu diễn lại cỏc phần tử thuộc GF(28) dưới hỡnh thức nhị phõn thỡ phộp cộng giữa {a7 a6 a5 a4 a3 a2 a1 a0} với {b7 b6 b5 b4 b3 b2 b1 b0} là {c7 c6 c5 c4 c3 c2 c1 c0} với ci = ai ⊕ bj , 0≤ i,j ≤ 7.

2.3.2 Phộp nhõn

Khi xột trong biểu diễn đa thức, phộp nhõn trờn GF(28) (ký hiệu •) tương ứng với phộp nhõn thụng thường của hai đa thức đem chia lấy dư (modulo) cho

một đa thức tốigiản (irreducible polynomial) bậc 8. Đa thức được gọi là tối giản khi và chỉ khi đa thức này chỉ chia hết cho 1 và chớnh mỡnh.

Trong thuật toỏn Rijndael, đa thức tối giản được chọn là :

m(x) = x8 + x4 + x3 + x +1 hay 1{1b} trong biểu diễn dạng thập lục phõn.

Kết quả nhận được là một đa thức bậc nhỏ hơn 8 nờn cú thể được biểu diễn dưới dạng 1 byte. Phộp nhõn trờn GF(28) khụng thể được biểu diễn bằng một phộp toỏn đơn giản ở mức độ byte.

Phộp nhõn được định nghĩa trờn đõy cú tớnh kết hợp, tớnh phõn phối đối với phộp cộng và cú phần tử đơn vị là {01}.Với mọi đa thức b(x) cú hệ số nhị phõn với bậc nhỏ hơn 8 tồn tại phần tử nghịch đảo của b(x), ký hiệu b-1(x) (được thực hiện bằng cỏch sử dụng thuật toỏn Euclide mở rộng ).

Nhận xột: Tập hợp 256 giỏ trị từ 0 đến 255 được trang bị phộp toỏn cộng (được định nghĩa là phộp toỏn XOR) và phộp nhõn định nghĩa như trờn tạo thành trường hữu hạn GF(28). 2.3.2.1 Phộp nhõn với x Phộp nhõn (thụng thường) đa thức b(x) = b7x7 + b6x6 + b5x5 + b4x4 + b3x3 + b2x2 + b1x + b0 = i i i x b ∑ = 7 0 với đa thức x cho kết quả là đa thức b7x8 + b6x7 + b5x6 + b4x5 + b3x4 + b2x3 + b1x2 + b0x. Kết quả x • b(x) được xỏc định bằng cỏch modulo kết quả này cho đa thức m(x). 1. Trường hợp b7 = 0

x • b(x) = b6x7 + b5x6 + b4x5 + b3x4 + b2x3 + b1x2 + b0x 2. Trường hợp b7 = 1

x • b(x) = ( b7x8 + b6x7 + b5x6 + b4x5 + b3x4 + b2x3 + b1x2 + b0x ) mod m(x) = (b7x8 + b6x7 + b5x6 + b4x5 + b3x4 + b2x3 + b1x2 + b0x ) - m(x)

Như vậy, phộp nhõn với đa thức x (hay phần tử {00000010} ∈ GF(28)) cú thể được thực hiện ở mức độ byte bằng một phộp shift trỏi và sau đú thực hiện tiếp phộp toỏn XOR với giỏ trị {1b}nếu b7 = 1 .Thao tỏc này được ký hiệu là

xtime(). Phộp nhõn với cỏc lũy thừa của x cú thể được thực hiện bằng cỏch ỏp dụng nhiều lần thao tỏc xtime(). Kết quả của phộp nhõn với một giỏ trị bất kỳ được xỏc định bằng cỏch cộng (⊕) cỏc kết quả trung gian này lại với nhau.

Khi đú, việc thực hiện phộp nhõn giữa hai phần tử a, b bất kỳ thuộc GF(28) cú thể được tiến hành theo cỏc bước sau:

1. Phõn tớch một phần tử (giả sử là a) ra thành tổng của cỏc lũy thừa của 2.

2. Tớnh tổng cỏc kết quả trung gian của phộp nhõn giữa phần tử cũn lại (là b) với cỏc thành phần là lũy thừa của 2 được phõn tớch từ a.

2.3.2.2 Vớ dụ:

{57} • {13} = {fe} vỡ {57} • {02} = xtime({57}) = {ae} {57} • {04}= xtime({ae}) = {47}

{57} • {10} = xtime({8e}) = {07}, Như vậy:

{57} • {13} = {57} • ({01} • {02} • {10}) = {57} • {ae} • {07} = {fe}

2.4 Phương phỏp Rijndael

Phương phỏp mó húa Rijndael bao gồm nhiều bước biến đổi được thực hiện tuần tự, kết quả đầu ra của bước biến đổi trước là đầu vào của bước biến đổi tiếp theo. Kết quả trung gian giữa cỏc bước biến đổi được gọi là trạng thỏi (state). Một trạng thỏi cú thể được biểu diễn dưới dạng một ma trận gồm 4 dũng và Nb cột với Nb bằng với độ dài của khối chia cho 32. Mó khúa chớnh (Cipher Key) cũng được biểu diễn dưới dạng một ma trận gồm 4 dũng và Nk cột với Nk bằng với độ dài của khúa chia cho 32. Trong một số tỡnh huống, ma trận biểu diễn một trạng thỏi hay mó khúa cú thể được khảo sỏt như mảng một chiều chứa cỏc phần tử cú độ dài 4 byte, mỗi phần tử tương ứng với một cột của ma trận. Số lượng chu kỳ, ký hiệu là Nr, phụ thuộc vào giỏ trị của Nb và Nk theo cụng thức: Nr = max{Nb,Nk}+ 6

Hinh5: Biểu diễn dạng ma trận của trạng thỏi (Nb = 6) và mó khúa (Nk = 4)

2.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. (adsbygoogle = window.adsbygoogle || []).push({});

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ý). Nr −1 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 Nr −1 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:

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],

begin byte state[4,Nb] state = in AddRoundKey(state, w) for round = 1 to Nr - 1 SubBytes(state) ShiftRows(state) MixColumns(state) AddRoundKey(state, w + round * Nb) end for SubBytes(state) ShiftRows(state) AddRoundKey(state, w + Nr * Nb) out = state

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: (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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}

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 33)