Cấu trúc bên trong của AES

Một phần của tài liệu nghiên cứu giải pháp xác thực và bảo mật tài liệu trong trao đổi văn bản trên môi trường mạng giữa các cơ quan nhà nước (Trang 31 - 36)

5. Bố cục Luận văn

2.2. Thuật toán mã khối AES

2.2.2. Cấu trúc bên trong của AES

AES là thuật toán mã khối với mã pháp là dãy các phép lặp, được thực hiện trên một cấu trúc không gian nào đó được gọi là trạng thái (state). Trạng thái có thể biểu diễn ở dạng khối chữ nhật các byte, 4 dòng và Nb=4 cột, độ dài bít là 128.

Khóa cũng được biểu diễn ở dạng khối chữ nhật. Mỗi khối khóa có 4 dòng, còn số cột có thể là 4, 6 hoặc 8. Độ dài khóa theo bit là 128, 192 hoặc 256.

Các giá trị đầu vào và ra của thuật toán được biểu diễn ở các khối byte một chiều với độ dài tương ứng. Trạng thái và khối khóa được ghi vào từ các khối đó, đầu tiên theo cột, còn sau đó theo các dòng.

Số lượng các vòng phụ thuộc vào kích cỡ khóa được chọn, ví dụ kích cỡ khóa 128 bit-10 vòng, 192 bit-12 vòng, và 256 bit – 14 vòng. Mỗi vòng gồm nhiều tầng khác nhau. Các tầng cho quá trình mã hóa và giải mã như sau:

* Mã hóa

Tầng thay thế byte (ByteSub)

Tầng thay thế byte gồm 16 S-box có các tính chất sau:

Các S-box giống hệt nhau.

Là thành phần phi tuyến duy nhất trong AES, nghĩa là: ByteSub(Si) + ByteSub(Sj)≠ByteSub(Si+Sj), i j, .

Là song ánh, nghĩa là tồn tại ánh xạ 1-1 của các byte đầu vào và đầu ra, điều này đảm bảo S-box có thể tồn tại duy nhất S-box ngược.

S-box của AES được xây dựng dựa trên ánh xạ nghịch đảo trên trường GF(28).

Ngoài ra nó phải thỏa mãn rất nhiều tiêu chuẩn an toàn khác như độ phi tuyển cao, bậc đại số cao (bằng 7), xác suất vi sai cực đại thấp, xac suất tuyến tính cực đại thấp, chỉ số ACmax,  thấp,...

Trong cài đặt bằng phần mềm, các S-box thường được thực hiện như một bảng tra.

Mỗi phần tử của S-box được xây dựng bằng cách: lấy nghịch đảo của byte {x x x x x x x x7 6 5 4 3 2 1 0} trong trường GF(28) có thể được biểu diễn là

7 6 5 4 3 2 1 0

{y y y y y y y y }

. Byte với giá trị „00‟h được ánh xạ với chính nó. Đầu vào của S-box có thể được tính nhờ phép biến đổi affin trong trường GF(28) được cho bởi phương trình sau đây:

0 0

1 1

2 2

3 3

4 4

5 5

6 6

7 7

10001111 1

11000111 1

11100011 0

11110001 0

11111000 0

01111100 1

00111110 1

00011111 0

y x

y x

y x

y x

y x

y x

y x

y x

      

      

     

     

     

   

     

     

     

     

     

      

   











Biến đổi affin cũng có thể được miêu tả dưới dạng biểu thức:

7 6 2 7 6 5 4 8

( ) ( ) ( )( ) mod( 1)

b xxxxxa x xxxxx x  . Tầng khuếch tán (ShiftRows và MixColumns)

Tầng khuếch tán nhằm tạo tính “khuyếch tán” qua mọi bit dữ liệu đầu vào (còn được gọi là tầng biến đổi tuyến tính), bao gồm 2 biến đổi là:

ShiftRows: hoán vị dữ liệu mức byte.

MixColumns: là một phép nhân ma trận với 1 cột – là phép tổ hợp (“trộn” dữ liệu) giữa các khối 4 byte với nhau.

Với biến đổi ShiftRows các hàng trong ma trận trạng thái được dịch vòng tròn. Dòng 0 được giữ nguyên, dòng 1 dịch chuyển theo 1 vị trí, dòng 2 theo 2 và dòng 3 theo 3 vị trí.

Với biến đổi MixColumns, các cột của khối trạng thái được xét đến như là các đa thức trên trường GF(28). Biến đổi thể hiện ở phép nhân modulo (x4+1) cột với một đa thức xác định là c x( ){03}x3{01}x2{01 }h x{02 }h .

Đa thức trên là nguyên tố cùng nhau với (x4+1), vì vậy phép nhân có tính thuận nghịch. Việc modulo với đa thức này đảm bảo kết quả sẽ là một đa thức có bậc nhỏ hơn 4, vì vậy có thể biểu diễn thành một word (4 byte - 32 bit).

Biến đổi này ở dạng ma trận có thể được biểu thị như sau:

0 0

1 1

2 2

3 3

02 03 01 01 01 02 03 01 01 01 02 03 03 01 01 02

b a

b a

b a

b a

 

   

 

   

 

     

   

 

   

 

    

trong đó 01,02,03 là các số viết dưới dạng cơ số 16.

Cụ thể với trạng thái S, tính toán s x'( )c x( )s x( ) với 0≤c≤Nb.

'

0, 0,

'

1, 1,

' 2, 2,

' 3,

3,

02 03 01 01 01 02 03 01 01 01 02 03 03 01 01 02

c c

c c

c c c c

s s

s s

s s s s

     

     

     

     

     

     

 

Sau phép nhân, 4 byte trong một cột sẽ được thay thế như sau:

'

0, 0, 1, 2, 3,

'

1, 0, 1, 2, 3,

'

2, 0, 1, 2, 3,

'

3, 3, 1, 2, 3,

({02} ) ({03} ) ({02} )({03} )

({02} ) ({03} )

({03} ) ({02} )

c c c c c

c c c c c

c c c c c

c c c c c

s s s s s

s s s s s

s s s s s

s s s s s

     

    

     

     

MixColumns tác động lên từng column trong trạng thái hiện hành.

Tầng cộng khóa (AddRoundKey)

Tầng cộng khóa bổ sung khóa con được thực hiện bởi phép XOR mỗi byte của khối trạng thái với byte tương ứng của khối khóa. Cụ thể với trạng thái S:

'

, , ,

r c r c r c

sks ,

Trong đó: 0 < r < 8, 0 ≤ c < Nb

Các khóa con được tạo ra từ thuật toán lược đồ khóa.

Lược đồ tạo khóa (Keyschedule)

Các khóa con được tính một cách đệ quy từ 128/192/256 bit khóa gốc đầu vào.

Mỗi vòng mã hóa/giải mã, sử dụng một khóa con cộng với một khóa con ở phần bắt đầu của thuật toán AES. Như vậy, số khóa con=số vòng +1. Tương ứng với mỗi kích cỡ khóa đầu vào có một lược đồ khóa. Với khóa 128 bit có số khóa con là 11, khóa 192 bit có số khóa con là 13 và khóa 256 bit có số khóa con là 15.

Sau đây là một ví dụ về lược đồ tạo khóa cho AES 128 bit khóa:

Xử lý theo hướng word (32 bit).

11 khóa con (khóa vòng) được lưu trữ lần lượt trong các word: W[0],..., W[3], W[4]...,W[7],...,W[40],..., W[43].

Khóa con đầu tiên (W[0],...,W[3]) chính là 128 bit khóa gốc.

Hàm g quay vòng 4 byte đầu vào và thực hiện một phép thay thế byte (qua S-box) nhằm tạo tính phi tuyến.

Hệ số vòng RC chỉ được cộng vào byte bên trái cùng và thay đổi theo số vòng.

0

[1] (00000001)2

RCx  ;

1

[2] (00000010)2

RCx  ;

2

[3] (00000100)2

RCx  ;...;

9

[3] (00110110)2

RCx  .

Lược đồ tạo khóa cho AES 128 bit khóa được minh họa trong hình 2.1.

Theo ngôn ngữ mô phỏng ngôn ngữ C, có thể biểu diễn quá trình mã hóa như sau:

Round(State, RoundKey) {

ByteSub(State);

ShiftRow(State);

MixRow(State);

AddRoundKey(State,RoundKey);

}

Phép lặp cuối cùng hơi khác so với còn lại:

FinalRound(State, RoundKey) {

ShiftRow(State);

AddRoundKey(State, RoundKey):

}

* Giải mã

AES không dựa vào cấu trúc Feistel nên mọi biến đổi phải thực hiện ngược khi giải mã. Với biến đổi MixColumn có InvMixColumns cho quá trình giải mã, với biến đổi ShiftRows, với ByteSub có InvByteSub. Tầng cộng khóa cũng phải thực hiện với các khóa con có thứ tự ngược lại.

InvMixColumns: sử dụng đa thức d x( ){0 }b x3{0 }d x2{09}x{0 }e . InvShiftRows: tất cả các hàng trong ma trận trạng thái được dịch vòng theo hướng ngược lại.

InvByteSub: Vì S-box là song ánh nên chúng ta có thể xây dựng một ánh xạ ngược sao cho Ai=S-1(Bj). Ánh xạ này được dùng khi giải mã. Nó thường được lưu trữ ở dạng một bảng tra.

Lược đồ khóa cho giải mã: Mọi khóa con phải được sử dụng theo thứ tự ngược lại. Trong thực tế, cả khi mã hóa và giải mã, chúng ta vẫn sử dụng cùng một lược đồ khóa. Điều này dẫn đến việc phải tính toán các khóa con trước khi mã hóa khối đầu tiên.

Một phần của tài liệu nghiên cứu giải pháp xác thực và bảo mật tài liệu trong trao đổi văn bản trên môi trường mạng giữa các cơ quan nhà nước (Trang 31 - 36)

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

(62 trang)