Hàm AddRoundKey của AES

Một phần của tài liệu Giáo trình: An toàn và bảo mật Thông tin ppsx (Trang 72 - 75)

2.5.4.2. Thuật toán sinh khóa (Key Expansion)

Thuật toá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 tú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

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)

temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]

else if (Nk > 6 and i mod Nk = 4)

temp = SubWord(temp)

end if

w[i] = w[i-Nk] xor temp

i = i + 1

end while end

SubWord() là một hàm nhận một input 4-byte và áp dụng bảng thế S -box lên input để nhận đƣợc một word output . Hàm RotWord() nhận một word input [a0, a1, a2, a3] thƣ̣c hiện mợt hoán vị vịng và trả về [a1, a2, a3, a0]. Các phần tử của mảng hằng số Rcon [i] chƣ́a các giá tri ̣ nhận đƣợc bởi [xi-1, {00}, {00}, {00}] trong đó xi-1 là mũ hóa của x (x đƣợc biểu diễn dƣới dạng {02} trên GF(28) và i bắt đầu từ 1).

Theo đoạn giả mã trên chúng ta có thế nhận thấy rằng Nk word của khóa kết quả sẽ đƣợc điền bởi khóa mã hóa . Các word sau đó w [i] sẽ bằng XOR với word đứng trƣớc nó w[i-1] với w[i-Nk]. Với các word ở vi ̣ trí chia hết cho Nk một biến đổi sẽ đƣợc thƣ̣c hiện với w[i-1] trƣớc khi thƣ̣c hiện phép XOR bit , sau đó là phép XOR với một hằng số Rcon [i]. Biến đổi này gồm một phép di ̣ch vòng các byte của một word (RotWord()), sau đó là áp dụng một bảng tra lên tất cả 4 byte của word (SubWord()).

Chú ý là thủ tục mở rợng khóa đới với các khóa có đợ dài 256 hơi khác so với thủ tục cho các khóa có đợ dài 128 hoặc 192. Nếu Nk = 8 và i – 4 là mợt bợi sớ của Nk thì SubWord() sẽ đƣợc áp dụng cho w[i-1] trƣớc khi thƣ̣c hiện phép XOR bit.

2.5.4.3. Thuật toán giải mã

Thuật toán giải mã khá giống với thuật toán mã hóa về mặt cấu trúc nhƣng 4 hàm cơ bản sƣ̉ dụng là các hàm ngƣợc của các hàm trong thuật toán giải mã . Đoạn giả mã cho thuật toán giải mã nhƣ sau:

InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)]) begin

AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) // See Sec. 5.1.4 for round = Nr-1 step -1 downto 1

InvShiftRows(state) // See Sec. 5.3.1 InvSubBytes(state) // See Sec. 5.3.2

AddRoundKey(state, w[round*Nb, (round+1)*Nb-1]) InvMixColumns(state) // See Sec. 5.3.3

end for InvShiftRows(state) InvSubBytes(state) AddRoundKey(state, w[0, Nb-1]) out = state end 2.5.4.3.1. Hàm InvShiftRows()

Hàm này là hàm ngƣợc của hàm ShiftRows () . Các byte của ba hàng cuối của mảng trạng thái sẽ đƣợc dịch vòng với các vị trí dịch khác nhau . Hàng đầu tiên không bị dịch, ba hàng cuối bi ̣ di ̣ch đi Nb – shift(r, Nb) byte trong đó các giá tri ̣ shift (r, Nb) phụ thuộc vào số hàng nhƣ trong phần 5.1.2.

Cụ thể hàm này tiến hành xử lý sau:

'

,( ( , ))mod , 0 4, 0 ( 4)

r c shift r Nb Nb r c

s  s   r  c Nb Nb

Một phần của tài liệu Giáo trình: An toàn và bảo mật Thông tin ppsx (Trang 72 - 75)

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

(148 trang)