Tải bản đầy đủ - 0 (trang)
Chương 3. THUẬT TOÁN MÃ HÓA AES

Chương 3. THUẬT TOÁN MÃ HÓA AES

Tải bản đầy đủ - 0trang

Chương 3: Thuật tốn mã hóa AES

>> bitxor(87,131)

ans =

212

3.2.2



Phép nhân



Trong cách biểu diễn một đa thức, phép nhân trong trường GF(2 8) (được ký

hiệu  ) tương ứng với phép nhân modulo một biểu thức tối giản bật 8. Một biểu

thức tối giản nếu nó chỉ chia được cho 1 và chính nó. Với thuật tốn AES, biểu thức

tối giản này là:

m(x) = x8 + x4 + x3 + x + 1

hay có thể được xem là {01}{1b} trong mã hexa.

Ví dụ như, {57}  {83} = {c1}, bởi vì

(x6 + x4 + x2 + x + 1 ) (x7 + x + 1) = x13 + x11 + x9 + x8 + x7 +

x7 + x 5 + x 3 + x 2 + x +

x6 + x 4 + x 2 + x + 1

= x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1



(x13 + x11 + x9 + x8 + x6 + x5 + x4 + x3 + 1) modulo (x8 + x4 + x3 + x + 1 )

= x7 + x 6 + 1

Việc thực hiện modulo cho đa thức m(x) bậc 8 để đảm bảo rằng kết quả đưa ra

sẽ là một đa thức có bật nhỏ hơn 8, như vậy ta có thể coi như đó là một byte. Khơng

giống như phép cộng, ở đây khơng có các tính tốn đơn giản trên các byte mà phải

thực hiện như phép nhân ở trên.

Phép nhân được định nghĩa là một sự kết hợp, và phần tử {01} gọi là phép

nhân đồng nhất. Cho bất kỳ đa thức nhị phân b(x) ≠0 có bậc nhỏ hơn 8, đảo của

b(x) ký hiệu là b-1(x) có thể tìm được dựa vào thuật toán Euclidean mở rộng được sử

dụng để tính các biểu thức a(x) và c(x) như sau:

b(x)a(x) + m(x)c(x) = 1

Ở đây, a(x)  b(x)mod m(x) = 1, có nghĩa là

b-1(x) = a(x)mod m(x)

Ngồi ra, với bất kỳ a(x), b(x) và c(x) ta có thể viết được như sau

a(x)  (b(x) + c(x)) = a(x)  b(x) + a(x)  c(x)



Chương 3: Thuật tốn mã hóa AES

Dẫn đến có thể thiết lập các giá trị của 256 byte , với việc thực hiện phép toán XOR

sử dụng như trong phép tốn cộng và nhân đã được trình bày phần trên, theo cấu

trúc của miền hữu hạn GF(28).



Hình 3.1. Mô tả phép nhân và chia hai số nhị phân

Úng dụng trong Matlab: Hàm poly_mult(a, b, mod_pol)

>>function ab = poly_mult(a, b, mod_pol)

>>



ab = 0;



>>



for i_bit = 1 : 8



>>



if (bitget(a, i_bit))



>>



b_shift = bitshift (b, i_bit - 1);



>>



ab = bitxor(ab, b_shift);



>>



end



>>



end



>>



for i_bit = 16 : -1 : 9



>>



if bitget(ab, i_bit)



>>



mod_pol_shift = bitshift(mod_pol, i_bit-9);



>>



ab = bitxor(ab, mod_pol_shift);



>>



end



>>end

3.2.3

hạn GF(28)



Đa thức với các hệ số trong trường hữu



Có 4 số hạng trong đa thức được định nghĩa, các hằng số trong trường hữu

hạn:



a(x) = a3x3 + a2x2 + a1x + a0



Chương 3: Thuật toán mã hóa AES

như là một Từ (Word) có dạng [a0,a1,a2,a3]. Chú ý rằng các biểu thức trong phần này

thì khác với các biểu thức được dùng trong việc định nghĩa các phần tử thuộc miền

giới hạn, mặc dù cả hai kiểu đa thức đều sử dụng cùng với biến x không xác định.

Các hệ số trong phần này là các phần tử trong miền hữu hạn, ví dụ như byte, thay

thế của các bit. Ngoài ra việc nhân 4 số hạng của đa thức sử dụng một đa thức biến

đổi khác, được định nghĩa bên dưới. Sự phân biệt luôn phải được rõ ràng trong mỗi

cách dùng.

Để minh họa cho phép cộng và nhân, giả sử có một đa thức

b(x) = b3x3 + b2x2 + b1x + b0

Phép cộng được thực hiện bằng cách thêm các hệ số trong miền hữu hạn tương

ứng với bật của x. Phép cộng này tương ứng với một phép toán XOR giữa các byte

tương ứng trong các Từ.

Như vậy dựa vào hai phương trình trên ta có thể thực hiện phép tốn cộng:

a(x) + b(x) = (a3  b3)x3 + (a2  b2)x2 + (a1  b1)x + (a0  b0)

và phép nhân được thực hiện thông qua hai bước:

Bước 1: Hàm c(x) = a(x)  b(x) được khai triển dưới dạng đại số.

Ta sẽ tìm được biểu thức của c(x) là

c(x) = c6x6 + c5x5 + c4x4 + c3x3 + c2x2 + c1x + c0

với

c0 = a0  b0



c4 = (a3  b1)  (a2  b2)  (a1  b3)



c1 = (a1  b0)  (a0  b1)



c5 = (a3  b2)  (a2  b3)



c2 = a2  b0  a1  b1  a0  b2



c6 = a3  b3



c3 = a3  b0  a2  b1  a1  b2  a0  b3

Kết quả, c(x), không xuất hiện một vectơ 4 byte nữa.

Bước 2: Lấy modulo của c(x) với một đa thức bật 4; kết quả có thể làm giảm

bật của đa thức bé hơn 4. Đối với thuật toán AES, bước này sẽ được thực hiện với

đa thức (x4 +1), vì vậy

xi mod(x4 +1) = xi mod 4

Kết quả của modulo a(x) và b(x), ký hiệu bằng a(x)  b(x), và kết quả cũng có

4 số hạng của đa thức d(x), và đa thức này được định nghĩa như sau:

d(x) = d3x3 + d2x2 + d1x + d0



Chương 3: Thuật tốn mã hóa AES

với



d0 = (a0  b0)  ( a3  b1)  (a2  b2)  ( a1  b3)

d1 = (a1  b0)  ( a0  b1)  (a3  b2)  ( a2  b3)

d2 = (a2  b0)  ( a1  b1)  (a0  b2)  ( a3  b3)

d3 = (a3  b0)  ( a2  b1)  (a1  b2)  ( a0  b3)

Khi a(x) là biểu thức cố định, phép tính được thực hiện thơng qua việc nhân



các ma trận có dạng như sau:

 d 0   a0 a3 a2 a1  b0 

 d   a a a a  b 

 1   1 0 3 2   1 

 d 2   a2 a1 a0 a3  b2 

 

  

 d 3   a3 a2 a1 a0  b3 



(*)



Bởi vì (x4 + 1) không là một đa thức tối giản trong miền GF(2 8), phép nhân

được thực hiện bởi một đa thức cố định bật 4 thì khơng nhất thiết nghịch đảo lại.

Tuy nhiên thuật toán AES chỉ ra một đa thức cố định bậc 3 và đã thực hiện phép

nghịch đảo

a(x) = {03}x3 +{01}x2 +{01}x +{02}

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

Một biểu thức tương tự sử dụng trong thuật tốn AES có a 0=a1=a2={00} và

a3={01}, một đa thức bật 3. Kiểm tra phương trình (*) ở trên sẽ chỉ ra dạng của Từ

đầu ra bằng cách quay các byte trong từ đầu vào. Có nghĩa là [b 0,b1,b2,b3] sẽ được

dịch thành [b1,b2,b3,b0].



Chương 3: Thuật tốn mã hóa AES



3.3



Q trình mã hóa bằng thuật tốn AES

Mã hóa là phương pháp sử dụng để bảo vệ tính bí mật của dữ liệu trong việc



truyền và nhận. Mã hóa được thực hiện cho một chuỗi hay một khối dữ liệu cần

được bảo vệ, được gọi là plaintext (bản gốc), và được thực hiện dựa trên một chuỗi

hay một khối khác gọi là encryption key (khóa mã), để thực hiện các thao tác toán

học và tạo ra kết quả được gọi là ciphertext (bản mã). Bản mã hóa rất khó hiểu và

được gởi đi trong mạng. Người nhận thực hiện các phương án giải mã (decryption)

để nhận được bản gốc từ bản mã bằng các khóa khác nhau. Khi việc mã hóa và giải

mã sử dụng cùng một khóa thì việc xử lý đó được gọi là mã hóa với khóa đối xứng.

Khóa này thơng thường xuất phát từ sự bí mật giữa nơi thu và nơi nhận, để mã hóa

được tốt thì ít nhất khóa phải có độ dài từ 64 bit trở lên. Khi việc mã hóa và giải mã

sử dụng 2 khóa khác nhau thì việc xử lý đó gọi là mã hóa với khóa khơng đối xứng.

Việc sử dụng khóa mã hóa đối xứng hay khơng đối xứng được sử dụng trong những

hệ thống không dây băng rộng. Trong phần này ta đi xét việc mã hóa với khóa đối

xứng được gọi là AES (Advanced Encryption Standard).

3.3.1



Thuật tốn mã hóa của AES



Thuật tốn AES hoạt động trên một khối dữ liệu có độ dài 128 bit, được xếp

vào trong một ma trận có kích thước 4 x 4 gọi là một state. Kích cỡ của khóa mã có

chiều dài 128,192, hay 256 bit, đặc biệt WiMAX sử dụng khóa 128 bit. Sơ đồ thuật

tốn và chương trình chính của thuật tốn AES:



Chương 3: Thuật tốn mã hóa AES



Q trình mã hóa AES

Cipher (input, output, roundkey)

begin

state = input

round = 0

AddRoundKey (state, roundkey[round])

for round = 1 to 9 in steps of 1

SubBytes(state)

ShiftRows(state)

MixColumns(state)

AddRoundKey(state,roundkey[round])

end for



Chương 3: Thuật tốn mã hóa AES

SubBytes(state)

ShiftRows(state)

AddRoundKey(state, roundkey[round+1])

output = state

end

Q trình mã hóa của AES bao gồm 4 thủ tục biến đổi byte cơ bản:

1. Kết hợp khóa vòng: AddRoundKey()

Mỗi byte của mảng State được kết hợp với mỗi byte của khóa vòng, các khóa

vòng được tạo ra từ q trình mở rộng khóa.

2. Thay thế Byte: SubBytes()

Đây là phép thế, trong đó mỗi byte sẽ được thay thế bằng một byte khác theo

bảng tra gọi là Hộp-S.

3. Thay đổi hàng: ShiftRows()

Thực hiện dịch vòng sang trái các hàng trong State.

4. Trộn dữ liệu: MixColumns()

Trộn dữ liệu bên trong mỗi cột của mảng State để tạo ra cột mới bằng cách

nhân với một đa thức cho trước a(x).

Tại vòng cuối cùng của q trình mã hóa sẽ khác các vòng trước đó, cụ thể là

biến đổi MixColumns() được thay thế bằng biến đổi AddRoundKey().

3.3.2



Thủ tục biến đổi SubBytes()



Với thủ tục SubBytes, mỗi byte trong state được thay thế với các byte khác,

sử dụng một bảng look-up thường được gọi là hộp S. Hộp S được tạo ra bắt nguồn

từ phép nghịch đảo trong trường hữu hạn GF(2 8), có tính chất phi tuyến. Hàm này

chỉ duy nhất cung cấp tính phi tuyến cho loại mã hóa này. Hộp-S được xây dựng

trên việc hợp thành của 2 thủ tục biến đổi là:

1. Đầu tiên tìm phần tử nghịch đảo trong trường hữu hạn GF(2 8) với phần tử

{00} được ánh xạ đến chính nó. Đa thức tối giản p(x) = (x 8 + x4 + x3 + x + 1) được

sử dụng để xây dựng trường hữu hạn GF(28) này.

2. Tiếp theo áp dụng biến đổi affine(trên GF(2)), được mô tả như sau:

b'i = bi  b(i+4)mod8  b(i+5)mod8  b(i+6)mod8  b(i+7)mod8  ci



Chương 3: Thuật toán mã hóa AES

với 0 i  8 , bi là bit thứ i của byte b, và c i là bit thứ i của byte c với giá trị

{63} hay {01100011}.

Trong dạng ma trận, phần tử biến đổi affine của Hộp-S có thể được biểu thị

như sau:

b0' 

 '  1

b1  1

b '  

 2  1

b3'  1

 '  

b4  1

 '  0

b5  

b '   0

 6  0

b7'  



0

1

1

1

1

1

0

0



0

0

1

1

1

1

1

0



0

0

0

1

1

1

1

1



1

0

0

0

1

1

1

1



1

1

0

0

0

1

1

1



1

1

1

0

0

0

1

1



1  b0  1 

 

1  b1  1 

1  b2  0

   

1  b3  0



0  b4  0

   

0  b5  1 

0 b6  1 

   

1  b7  0



Mặc dù hộp S có thể được tính tốn nhưng cơng việc đơn giản trên có thể

được thay thế bằng một bảng có sẳn được lưu trong bộ nhớ.

Hình bên dưới mơ tả thủ tục biến đổi SubBytes() trên State thông qua Hộp-S.

Hộp-S sử dụng cho quá trình này gọi là Hộp-S thuận.



Hình 3.2. Thủ tục biến đổi SubBytes()

Dựa vào hàm s_box_gen để xây dựng hàm sub_bytes

>>function bytes_out = sub_bytes(bytes_in, s_box)

>>



bytes_out = s_box(bytes_in+1);



Hộp S thuận được sử dụng bằng cách tương ứng với các giá trị x và y để đưa ra một

kết quả duy nhất.



Chương 3: Thuật tốn mã hóa AES



3.3.3



Thủ tục biến đổi ShiftRows()



Với thủ tục biến đổi ShiftRows, mỗi hàng chuyển tuần tự với một số lượng

bước là cố định. Đặc biệt, các phần tử của hàng đầu tiên sẽ không thay đổi vị trí,

hàng thứ hai dịch sang trái một cột, hàng thứ ba dịch sang trái hai cột, hàng cuối

cùng sẽ dịch sang trái ba cột. Thao tác này nhằm đảm bảo mỗi cột của bảng đầu ra

đều được tạo thành từ các cột của bảng trạng thái đầu vào. Hình bên dưới biểu diễn

thủ tục biến đổi ShiftRows()



Hình 3.3. Thủ tục biến đổi ShiftRows()

3.3.4



Thủ tục biến đổi MixColumns()



Với thủ tục biến đổi MixColumns, mỗi cột được chuyển đổi tuyến tính bằng

cách nhân nó với một ma trận trong trường hữu hạn. Chính xác hơn mỗi cột được

xem như một đa thức trong trường GF(2 8) và được nhân modulo (x4+1) với một

biểu thức cố định c(x) = 3x3 + x2 + x + 2. Ta đi đến biểu thức như sau:

s'(x)=a(x).s(x)mod(x4+1)

với



a(x)= {03}x3 + {01}x2 + {01}x + {02}



Chương 3: Thuật tốn mã hóa AES

Như mơ tả trong phần trên, phép tốn này có thể được viết như một phép nhân ma

trận như sau:

s'(x) = C(x)  s(x)

Với ma trận C(x) là

02

01

C (x) 

01



03



03 01 01

02 03 01

01 02 03



01 01 02



vậy ta sẽ có biểu thức như sau:

 s0' ,c  02

 '   H

 s1,c  01H

 '  

 s 2,c  01H

 s '  03 H

 3, c 



03 H



01H



02 H



03 H



01H



02 H



01H



01H



01H   s0,c 

 

01H   s1,c 

03 H   s 2,c 

 

02 H   s3,c 



với 0 c  10



kết quả phép nhân, bốn byte trong một cột được thay thế như sau:

s’0,c = ({02}  s0,c)  ({03}  s1,c)  s2,c  s3,c

s’1,c = s0,c  ({02}  s1,c)  ({03}  s2,c)  s3,c

s’2,c = s0,c  s1,c  ({02}  s2,c)  ({03}  s3,c)

s’3,c = ({03}  s0,c)  s1,c  s2,c  ({02}  s3,c)



Hình 3.4. Thủ tục biến đổi MixColumns()

3.3.5



Thủ tục biến đổi AddRoundKey()



Với thủ tục AddRoundKey, mỗi byte trong ma trận State được thực hiện phép

XOR với một khóa vòng, q trình xử lý AES thu được 11 khóa vòng từ các khóa

mã được phân phát trong kỹ thuật mã hóa. Việc phân phát các khóa mã là kết quả

của sự biến đổi các con số, chẳng hạn như hàm băm, và được thực hiện dựa trên dãy



Chương 3: Thuật tốn mã hóa AES

khóa bí mật ban đầu. 11 khóa vòng được tìm từ khóa mã bằng cách sử dụng giải

thuật tính tốn đơn giản.



Hình 3.5. Thủ tục biến đổi AddRoundKey()

Key Schedule: Các khóa con được tìm ra từ các khóa mật mã bằng cách nằm

giữa của key schedule với mỗi vòng tuỳ thuộc vào từ của khóa dữ liệu Nb. Đối với

khóa 128bit, key schedule hoạt động thực chất trên các khối 4 từ 32 bit. Round Key

bao gồm có hai thành phần: Key Expansion(khóa mở rộng) và Round Key Selection

(lựa chọn khóa vòng).



3.4



Q trình mở rộng khóa của AES

AES thực hiện một q trình mở rộng khóa từ khóa mật mã để tạo ra các khóa



mới gọi là khóa vòng. Q trình mở rộng khóa mang lại một chuỗi khóa có độ dài là

16 byte và sử dụng liên tục ma trận rcon và đồng thời dựa vào hộp S để tạo ra một

khóa có độ dài 176 byte, sẽ được sử dụng trong suốt quá trình mã hóa và giải mã.

16 byte của vectơ khóa được xếp vào trong một ma trận khóa 4 x 4 như ban đầu

(k11,…, k44).

3.4.1



Các bước của quá trình mở rộng khóa



Q trình Mở rộng khóa trong AES bao gồm các thủ tục biến đổi hướng byte

như sau:

1. Thiết lập dạng ma trận khóa khởi tạo:

Biến đổi vectơ Khóa đầu vào thành ma trận Khóa khởi tạo 4x4 byte.



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Chương 3. THUẬT TOÁN MÃ HÓA AES

Tải bản đầy đủ ngay(0 tr)

×