III. Thuật toán AES - Thực hiện (tiếp theo)
4. AddRoundKey
Trong quá trình mã hóa và giải mã bằng thuật toán AES, bước AddRoundKey xuất hiện tổng cộng 11 lần cho AES-128. Bước này được thực hiện ngay trước khi bắt đầu các vòng mã hóa và cũng là bước cuối cùng trong mỗi vòng. AddRoundKey thực hiện phép toán XOR giữa bảng trạng thái hiện tại và nhóm khóa bí mật tương ứng. Kết quả là một bảng trạng thái mới được đưa vào sử dụng trong giai đoạn tiếp theo.
Dù chỉ là phép toán đơn giản, AddRoundKey lại là bước duy nhất trong toàn bộ 44 bước của quy trình mã hóa AES có sự tham gia của khóa bí mật. Điều này khiến cho việc giải mã khó khăn hơn nếu kẻ tấn công chỉ có được văn bản đã mã hóa mà không có thông tin về khóa bí mật.
Dưới đây là một đoạn mã Python minh họa cho việc thực hiện hàm AddRoundKey:
python
state = [
[206, 243, 61, 34],
[171, 11, 93, 31],
[16, 200, 91, 108],
[150, 3, 194, 51],
]
round_key = [
[173, 129, 68, 82],
[223, 100, 38, 109],
[32, 189, 53, 8],
[253, 48, 187, 78],
]
def add_round_key(state, round_key):
state_arr, round_key_arr, new_state_arr = [], [], []
for i in state:
for j in i:
state_arr.append(j)
for i in round_key:
for j in i:
round_key_arr.append(j)
for i in range(16):
new_state_arr.append(state_arr[i] ^ round_key_arr[i])
return new_state_arr
new_state_arr = add_round_key(state, round_key)
print(new_state_arr) # [99, 114, 121, 112, 116, 111, 123, 114, 48, 117, 110, 100, 107, 51, 121, 125]
Chương trình này lấy các phần tử từ hai ma trận state
và round_key
, sau đó thực hiện phép XOR cho từng phần tử tương ứng và lưu kết quả vào mảng new_state_arr
. Để có được bảng trạng thái mới, chúng ta có thể chuyển mảng này thành ma trận 4x4.
5. SubBytes
SubBytes là bước thực hiện ở đầu mỗi vòng mã hóa, tổng cộng 10 lần cho AES-128. Trong các vòng giải mã, chúng ta có bước InvSubBytes thực hiện ngược lại với SubBytes và đứng thứ hai trong mỗi vòng.
Bước SubBytes thay thế từng phần tử trong bảng trạng thái hiện tại bằng một phần tử tương ứng trong bảng S-box. S-box là một bảng 16x16 chứa các giá trị cố định được biểu diễn bằng hệ thập lục phân.
Bảng S-box
Hàng/Cột | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0x63 | 0x7c | 0x77 | 0x7b | 0xf2 | 0x6b | 0x6f | 0xc5 | 0x30 | 0x01 | 0x67 | 0x2b | 0xfe | 0xd7 | 0xab | 0x76 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
Quy tắc thay thế là: Với phần tử 0xαβ trong bảng trạng thái, ta thay thế bằng phần tử tại hàng α và cột β trong S-box.
Tương tự, InvSubBytes sử dụng bảng Inv-S-box để thực hiện việc thay thế ngược lại.
6. ShiftRows
Bước ShiftRows được thực hiện ngay sau SubBytes trong mỗi vòng và xảy ra 10 lần cho AES-128. Đối với các vòng giải mã, chúng ta có InvShiftRows thực hiện hướng ngược lại.
Bước ShiftRows làm việc bằng cách dịch chuyển các phần tử trong từng hàng của bảng trạng thái sang trái một số đơn vị tương ứng, tùy theo thứ tự của hàng đó. Hàm shift_rows()
trong Python thực hiện như sau:
python
def shift_rows(s):
s[0][1], s[1][1], s[2][1], s[3][1] = s[1][1], s[2][1], s[3][1], s[0][1]
s[0][2], s[1][2], s[2][2], s[3][2] = s[2][2], s[3][2], s[0][2], s[1][2]
s[0][3], s[1][3], s[2][3], s[3][3] = s[3][3], s[0][3], s[1][3], s[2][3]
Trong quá trình giải mã, InvShiftRows sẽ dịch chuyển các phần tử trong từng hàng theo chiều ngược lại. Bạn có thể thực hiện hàm inv_shift_rows()
tương tự.
7. MixColumns
MixColumns là bước khác biệt so với tất cả 33 bước còn lại, vì nó chỉ được thực hiện 9 lần trong tổng số 10 vòng mã hóa, đồng thời nó không được thực hiện trong vòng cuối cùng của quá trình mã hóa và giải mã.
MixColumns thực hiện phép toán ma trận với ma trận đặc biệt chứa các giá trị cố định. Để tính toán từng phần tử trong mỗi cột, bạn sẽ sử dụng quy tắc tính toán theo từng hàng của ma trận.
Bài tập dành cho bạn đọc là hoàn thiện quy trình MixColumns cho bảng trạng thái đã cho, dựa trên các công thức đã được trình bày.
Tài liệu tham khảo
Thông qua các bước phân tích này, bạn đã có cái nhìn tổng quan và chi tiết về những bước quan trọng trong thuật toán mã hóa AES, cũng như cách chúng hoạt động trong quy trình mã hóa dữ liệu.
source: viblo