Thao tỏc AddRoundKey

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

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

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

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

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 số phương phỏp mó húa. Trong trường hợp thuật toỏn Rijndael với số lượng chu kỳ lớn hơn 6, khụng tồn tại phương phỏp cụng phỏ mật mó nào hiệu quả hơn phương phỏp thử và sai . Tớnh chất phức tạp của biểu thức S-box trờn GF(28) cựng với hiệu ứng khuếch tỏn giỳp cho thuật toỏn khụng thể bị phõn tớch bằng phương phỏp nội suy

2.6.2 Đỏnh giỏ

Phương phỏp Rijndael thớch hợp cho việc triển khai trờn nhiều hệ thống khỏc nhau, khụng chỉ trờn cỏc mỏy tớnh cỏ nhõn mà điển hỡnh là sử dụng cỏc chip Pentium, mà cả trờn cỏc hệ thống thẻ thụng minh. Trờn cỏc mỏy tớnh cỏ nhõn, thuật toỏn AES thực hiện việc xử lý rất nhanh so với cỏc phương phỏp mó húa khỏc. Trờn cỏc hệ thống thẻ thụng minh, phương phỏp này càng phỏt huy ưu điểm khụng chỉ nhờ vào tốc độ xử lý cao mà cũn nhờ vào mó chương trỡnh ngắn gọn, thao tỏc xử lý sử dụng ớt bộ nhớ. Ngoài ra, tất cả cỏc bước xử lý của việc mó húa và giải mó đều được thiết kế thớch hợp với cơ chế xử lý song song nờn phương phỏp Rijndael càng chứng tỏ thế mạnh của mỡnh trờn cỏc hệ thống thiết bị mới.

Do đặc tớnh của việc xử lý thao tỏc trờn từng byte dữ liệu nờn khụng cú sự khỏc biệt nào được đặt ra khi triển khai trờn hệ thống big-endian hay little-endian. Xuyờn suốt phương phỏp AES, yờu cầu đơn giản trong việc thiết kế cựng tớnh linh hoạt trong xử lý luụn được đặt ra và đó được đỏp ứng. Độ lớn của khối dữ liệu cũng như của mó khúa chớnh cú thể tựy biến linh hoạt từ 128 đến 256-bit với điều kiện là chia hết cho 32. Số lượng chu kỳ cú thể được thay đổi tựy thuộc vào yờu cầu riờng được đặt ra cho từng ứng dụng và hệ thống cụ thể. Tuy nhiờn, vẫn tồn tại một số hạn chế mà hầu hết liờn quan đến quỏ trỡnh giải mó.

Mó chương trỡnh cũng như thời gian xử lý của việc giải mó tương đối lớn hơn việc mó húa, mặc dự thời gian này vẫn nhanh hơn đỏng kể so với một số phương phỏp khỏc. Khi cài đặt bằng chương trỡnh, do quỏ trỡnh mó húa và giải mó khụng giống nhau nờn khụng thể tận dụng lại toàn bộ đoạn chương trỡnh mó húa cũng như cỏc bảng tra cứu cho việc giải mó. Khi cài đặt trờn phần cứng, việc giải mó chỉ sử dụng lại một phần cỏc mạch điện tử sử dụng trong việc mó húa và với trỡnh tự sử dụng khỏc nhau. Phương phỏp Rijndael với mức độ an toàn rất cao cựng cỏc ưu điểm đỏng chỳ ý khỏc chắc chắn sẽ nhanh chúng được ỏp dụng rộng rói trong nhiều ứng dụng trờn cỏc hệ thống khỏc nhau.

Chương 3

CÀI ĐẶT CHƯƠNG TRèNH

3.1 Tổng quan về chương trỡnh

Chương trỡnh được xõy dựng và cài đặt trờn ngụn ngữ C++,với hai chức năng chớnh là mó húa hoặc giải mó một tệp văn bản. Quỏ trỡnh mó húa và giải mó được thực hiện đồng thời một khối tại một thời điểm,với hai chức năng như sau:

RijndaelEncrypt(rk,nrounds,plaintext,ciphertext)

(// mó húa văn bản thụ( palintext) và gi dữ liệu vào văn bản mó húa(ciphertext)). RijndaelDecrypt(rk,nrounds, ciphertext ,plaintext)(// giải mó nội dung của ciphertext và gi dữ liệu vào plaintext)

Với:

Cosnt unsigned long *rk là con trỏ mó húa / giải mó

Int nrounds số vũng mó húa / gải mó được tớnh toỏn theo rijndaelsetupencrypt / rijndaelsetupdecrypt

Const unsigned long plaintext văn bản chữ thụ

Const unsigned long ciphertext văn bản mó húa

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