Tải bản đầy đủ - 0 (trang)
CHƯƠNG 1: TỔNG QUAN VỀ MÃ KHỐI AES

CHƯƠNG 1: TỔNG QUAN VỀ MÃ KHỐI AES

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

Các mảng byte được biểu diễn theo dạng sau: a0 a1 a2 … an-1 (với n=16, 24 hay 32

tùy thuộc vào độ dài của dữ liệu đầu vào là 128 bit, 192 bit và 256 bit).

1.2.3. Mảng trạng thái

Mảng trạng thái là một mảng hai chiều gồm 4 hàng, Nb cột, ký hiệu là s được dùng

để lưu trữ giá trị trung gian trong mỡi bước của q trình xử lý

Bắt đầu của phép mã hoá hay giải mã là việc sao chép mảng các byte in 0, in1, in2, …,

in15 đầu vào mảng trạng thái s theo công thức sau:

s[r,c]= in[r+4c], v_i 0 ≤ r, c ≤ 4

Vào cuối q trình mã hố hay giải mã, mảng trạng thái sẽ được sao chép vào mảng

byte đầu ra theo công thức: out0, out1, out2, …, out15

Bốn byte trên mỗi cột của mảng trạng thái được tạo thành một từ 32 bit là một mảng

gồm 4 byte được đánh chỉ mục theo hàng r. Từ đó ta có thể coi mảng trạng thái là một

mảng một chiều gồm các từ w0, w1, w2, w3, trong đó các giá trị cột c dùng làm chỉ mục

cho bảng.

1.3. Cơ sở toán học

Hai phép cộng và phép nhân trên trường Galoris GF (2 8) là cở sở toán học của thuật

toán AES. Chúng ta sử dụng biểu diễn đa thức của GF(2 8) được định nghĩa sau đây: một

byte (là phần tử của GF(2 8)) được xem là một đa thức có bậc nhỏ hơn hay bằng với các

hệ số trong trường hữu hạn GF(2):

Tập tất cả các giá trị byte có thể tương ứng với tập tất cả các đa thức bậc nhỏ hơn 8.

Chú ý rằng các giá trị byte ở đây được ghi dưới dạng hexa, cho nên 57 tương ứng với

01010111 và đa thức tương ứng là:

1.3.1. Phép cộng

Phép cộng ở đây được hiểu là phép XOR trên hai bit tương ứng trong byte và có ký

hiệu là

Ví dụ: Tổng các đa thức được ký hiệu bởi 57 và 83 là một đa thức được kí hiệu bằng

D4, đó là do:



11



= + + (1⊕1) x + (1⊕1)

=+

Trong biểu diễn nhị phân ta có:01010111 # 10000011 = 11010100. Rõ ràng, phép

cộng có thể được cài đặt bằng lệnh bitwise XOR.

1.3.2. Phép nhân

Phép nhân trên trường GF(28), ký hiệu là ⊗ 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ối giản bậc 8. Trong thuật toán

AES, đa thức tối giản được chọn là: m(x) = x 8 + x4 + x3 + x + 1 hay {01} {1b} nếu biểu

diễn dưới dạng hexa.

Kết quả nhận được của phép rút gọn là một đa thức có bậc nhỏ hơn 8 nên có thể biểu

diễn được dưới dạng 1 byte.

Ví dụ, tích của hai phần tử được ký hiệu bởi 57 và 83 là phần tử C1:



= (+ + ) ⊕ () ⊕ ()



=+ +

= ++ 1 (mod + )

1.3.3. Phép nhân với x

Phép nhân với đa thức x (hay phần tử {00000010} € GF (2 8) có thể được thực hiện

ở mức độ byte bằng một phép dịch trái và sau đó thực hiện tiếp phép XOR với giá trị

{1b} nếu b7=1. Thao tác được ký hiệu là xtime(). Phép nhân với các luỹ 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ả phép nhân với một

giá trị bất kỳ được xác định bằng phép cộng () các kết quả trung gian này lại với nhau.

1.3.4. Phép nhân nghịch đảo

Phần tử ngược cho phép nhân có thể tìm được bằng thuật tốn Euclidean mở rộng.

Giả sử a(x) là đa thức mà chúng ta muốn tìm nghịch đảo của nó. Thuật tốn Euclidean mở

rộng có thể được sử dụng để tìm hai đa thức b(x) và c(x) sao cho:

a(x) b(x) + m(x) c(x) = gcd(a(x), m(x))

gcd(a(x), m(x) luôn bằng 1 khi và chỉ khi m(x) là bất khả qui. Do đó:

12



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

điều này có nghĩa rằng b(x) là phần tử ngược của a(x) theo định nghĩa của phép nhân.

1.3.5. Đa thức với các hệ số trên trường GF(28)

Phép nhân của hai đa thức bậc 4 với các hệ số trên GF(2 8) a(x) ⊗ b(x) được xác định

bằng 4 hạng tử d(x):

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

trong đó:

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) ⊕ (01 • b3)

1.4. Cấu trúc AES

AES là một mã khối, nhưng khác với các mã khối khác được biết đến trước đây

(DES, IDEA,…), dữ liệu trong AES không được biểu diễn dưới dạng một mảng các byte

hay các bit mà được biểu diễn dưới dạng một ma trận 4xNb và được gọi là mảng trạng thái

(state). Trong đó, đối với AES, Nb ln có giá trị bằng 4. Trong khi thuật tốn Rijndael hỡ

trợ ba giá trị của Nb là 4, 6, 8 tương ứng với kích thước khối 128, 192 và 256 bit. Dữ liệu

đầu vào được đọc vào ma trận state theo từng cột, theo thứ tự từ trên xuống dưới, từ trái

qua phải. Dữ liệu đầu ra được đọc từ ma trận cũng theo quy tắc trên.



13



Hình 1.1: Cấu trúc cơ sở của thuật tốn AES

Trong đó:

Tầng phi tuyến: thể hiện tính xáo trộn, các byte được thế thông qua bản tra S-box.

Tầng trộn tuyến tính: đảm bảo khếch tán cao qua nhiều vòng. Tầng trộn tuyến tính

trong AES bào gồm 2 hàm con: ShiftRows và MixColumns.

Tầng cộng khóa: là phép XOR từng bit của RoundKey và trạng thái trung gian.

1.5. Phép biến đổi vòng, số các vòng

Khóa vòng trong AES cũng được biểu diễn hoàn toàn tương tự như cách biểu diễn

dữ liệu. Tuy nhiên, tùy vào kích thước khóa mà số cột của ma trận khóa vòng Nk sẽ khác

nhau. Cụ thể, Nk nhận các giá trị 4, 6, 8 tương ứng với các kích thước khóa là 128, 192 và

256 bit. Đây chính là điểm mạnh của thuật tốn AES trong vấn đề mở rộng khóa.



14



Hình 1.2:Biểu diễn khóa vòng

Số vòng lặp ký hiệu là Nr, phụ thuộc vào hai đại lượng Nb và Nk. Vì Nb trong AES

có giá trị cố định nên Nr chỉ phụ thuộc vào Nk. Giá trị của Nr tương ứng với ba giá trị của

Nk là Nr = 10, 12, 14. Cụ thể, giá trị Nr được xác định bởi

Bảng 1.1: Xác định số vòng



1.6. Quy trình mã hóa AES

Bắt đầu thuật tốn bản rõ (input) được copy vào mảng trạng thái sử dụng các qui

ước được mô tả trong phần 1.4. Sau khi cộng với khóa Round Key khởi tạo mảng trạng

thái được biến đổi bằng các thực hiện một hàm vòng (round function) Nr lần (10, 12, hoặc

14 phụ thuộc vào độ dài khóa) trong đó lần cuối cùng thực hiện khác các lần trước đó.

Trạng thái sau lần lặp cuối cùng sẽ được chuyển thành output của thuật tốn.

Hàm vòng được tham số hóa sử dụng một (key schedule) dãy các khóa được biểu

diễn như là một mảng 1 chiều của các word 4-byte được sinh ra từ thủ tục sinh khóa (Key

Expansion).

Thuật tốn AES khá phức tạp, được mơ tả khái quát gồm 3 bước như sau:

+) 1 Vòng khởi tạo chỉ gồm phép AddRoundKey

+) Nr -1 Vòng lặp gồm 4 phép biển đổi lần lượt: SubBytes, ShiftRows,

MixColumns, AddRoundKey.

+) 1 Vòng cuối gồm các phép biến đổi giống vòng lặp và khơng có phép

MixColumns.



15



Quy trình được mơ tả qua đoạn giả mã sau:

void Cipher(unsigned char state[4][4] {

int i,j,round=0;

AddRoundKey(state, 0);

for(round=1;round
SubBytes(state);

ShiftRows(state);

MixColumns(state);

AddRoundKey(state, round);

}

SubBytes(state);

ShiftRows(state);

AddRoundKey(state,Nr);

}

1.6.1. Hàm SubBytes()

Hàm SubBytes() thực hiện phép thay thế các byte của mảng trạng thái bằng cách sử

dụng một bảng thế S -box, bảng thế này là khả nghịch và được xây dựng bằng cách kết

hợp hai biến đối sau:

+) Nhân nghịch đảo trên trường hữu hạn GF (2 8), phần tử {00} được ánh xa ̣thành

chính nó

+) Áp dụng biến đổi Affine sau (trên GF(2)):

b’I = bi ⊕ b(i+4) mod 8 ⊕ b(i+5) mod 8 ⊕ b(i+6) mod 8 ⊕ b(i+7) mod 8 ⊕ ci trong đó 0 <= I < 8 là bit thứ i

của byte b tương ứng và ci là bit thứ i của byte c với giá trị {63} hay {01100011}.

Các phần tử biến đổi affine của S-box có thể được biểu diễn dưới dạng ma trận như

sau:



16



Trong đó phép cộng thực hiện như phép XOR.

Hình sau minh họa kết quả của việc áp dụng hàm biến đổi SubBytes () đối với mảng

trạng thái:



Hình 1.3:Hình minh họa biến đổi SubBytes với mảng trạng thái

Bảng thế S -box được sử dụng trong hàm SubBytes () có thể được biểu diễn dưới

dạng hexa như sau:



17



Bảng 1.2: Bảng thể S-BOX của AES



Trong đó chẳng hạn nếu S1,1 = {53} có nghĩa là giá trị thay thế sẽ được xác định

bằng giao của hàng có chỉ số 5 với cột có chỉ số 3 trong bảng trên điều này tương đương

với việc S’ 1,1 = {ed}.

1.6.2. Hàm ShiftRows()

Phép biến đổi ShiffRows: các hàng được dịch vòng một số bước nhất định. Đối với

mã khối AES:

+) Dòng thứ nhất được giữ nguyên.

+) Dòng thứ 2 dịch vòng trái 1 vị trí(1 byte).

+) Dòng thứ 3 dịch vòng trái 2 vị trí.

+) Dòng thứ 4 dịch vòng trái 3 vị trí.



18



Hình 1.4:Phép biến đổi ShifftRows()

1.6.3. Hàm MixColumns()

Hàm này làm việc trên các cột của bảng trạng thái , nó coi mỗi cột của mảng trạng

thái như là một đa thức gồm 4 hạng tử. Các cột sẽ được xem như là các đa thức trên GF

(28) và được nhân theo modulo x4 + 1 với một đa thức cố định a(x):

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

Biểu diễn dưới ma trận ta sẽ có:

S’(x) = a(x) ⊗ S(x)



với mọi 0 <= c < Nb = 4.

Kết quả là bốn byte trong mỗi cột sẽ được thay thế theo công thức sau:

S’0,c = ( {02}● S0,c ) ⊕ ( {03} ● S1,c ⊕ S2,c ⊕ S3,c

19



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 )

Có thể minh họa việc thực hiện của hàm này bằng hình vẽ sau:



Hình 1.5: Hàm MixColumns của AES

1.6.4. Hàm AddRoundKey()

Hàm này được áp dụng từ vòng lặp thứ 1 tới vòng lặp

Trong biến đổi Addroundkey(), một khóa vòng được cộng với trạng thái bằng một

phép XOR theo từng bit đơn giản.

Mỡi khóa vòng gồm có 4 từ (128 bit) được ký hiệu ExpendedKey. 4 từ đó được cộng

vào mỗi cột của trạng thái. Phép biến đổi AddRoundKey được minh họa như sau:



20



S0,0

S1.0

S2,0

S3,0



S0,1

S1,1

S2,1

S3,1



S0,2

S1,2

S2,2

S3,2



S0,3

S1,3

S2,3

S3,3



k0,0

k1.0

k2,0

k3,0



k0,1

k1,1

k2,1

k3,1



k0,2

k1,2

k2,2

k3,2



k0,3

k1,3

k2,3

k3,3



S’0,0

S’1.0

S’2,0

S’3,0



S’0,1

S’1,1

S’2,1

S’3,1



S’0,2

S’1,2

S’2,2

S’3,2



S’0,3

S’1,3

S’2,3

S’3,3







=



1.6.5. Thuật toán sinh khoá (Key Expansion)

Thuật tốn sinh khóa của AES nhận một khóa mã hóa K sau đó thực hiện một thủ

tục sinh khóa để sinh một dãy các khóa cho việc mã hóa . Thủ tục này sẽ sinh tổng số

Nb*(Nr+1) word, thủ tục sử dụng một tập khởi tạo Nb word và mỗi một lần lặp trong số

Nr lần sẽ cần tới Nb word của dữ liệu khóa . Dãy khóa kết quả là một mảng tuyến tính các

word 4-byte được ký hiệu là [wi] trong đó 0 ≤i < Nb(Nr+1).

Sự mở rộng khóa thành dãy khóa được mơ tả qua đoạn giả mã sau:

KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)

begin

word temp

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

temp = w[i-1]

If (i mod Nk = 0)

21



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

CHƯƠNG 1: TỔNG QUAN VỀ MÃ KHỐI AES

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

×