3.2.1. Khối AddRoundKey
AddRoundKey thực chất là một cổng XOR hai đầu vào 128 bít của dữ liệu và từ khóa.
Hoạt động của khối AddRoundKey được mô tả bằng đoạn code VHDL sau: process (data, key)
begin
d_out <= data xor key ; end process;
Hình 3.7.Sơ đồ thuật toán khối giải mã - Dạng 2
3.2.2. Khối SubByte
Như đã đề cập ở chương 3, đầu ra của khối SubByte là ánh xạ của đầu vào qua bảng S-box.
Hình 3.8. Khối SubByte
S-box là một bảng gồm 16 hàng và 16 cột tương ứng với 256 trường hợp đầu vào. Hoạt động của khối SubByte được mô tả bởi đoan code VHDL sau :
process (in_put) begin case in_put is when “00000000” => out_put <= “01100011”; when “00000001” => out_put <= “01111100”; … -- (253 trường hợp ) when “11111111” => out_put <= “00010110”; end process; 3.2.3. Khối ShiftRow
Khối ShiftRow có đầu vào 128 bit (127 downto 0) và đầu ra 128 bit (127 downto0).
Đầu vào và đầu ra của khối này được bố trí thành một bảng 4x3. Khối Demux sẽ thực hiện chia đầu vào thành bảng đầu vào và khối Mux sẽ biến đổi bảng đầu ra thành đầu ra. Ta tiến hành đổi chỗ các ô của bảng đầu vào để thu được bảng đâu ra như đã nêu trong phần lí thuyết ở chương II.
Hình 3.9.Khối ShiftRow
Chú ý: Trên hình, các đầu ra và đầu vào cùng tên sẽ được nối với nhau. Đoạn code VHDL sau sẽ mô tả hoạt động của hai khối Demux và Mux :
--Khối Demux: begin S00 <= in_put(7 downto 0); S01 <= in_put(15 downto 8); S02 <= in_put(23 downto 16); S03 <= in_put(31 downto 24); S10 <= in_put(39 downto 32); S11 <= in_put(47 downto 40); S12 <= in_put(55 downto 48); S13 <= in_put(63 downto 56);
S20 <= in_put(71 downto 64); S21 <= in_put(79 downto 72); S22 <= in_put(87 downto 80); S23 <= in_put(95 downto 88); S30 <= in_put(103 downto 96); S31 <= in_put(111 downto 104); S32 <= in_put(119 downto 112); S33 <= in_put(127 downto 120); end behavior ; -- Khối Mux begin
out_put <= S32 & S21 & S10 & S03 & S31 & S20 & S13 & S02 & S30 & S23 & S12
& S01 & S33 & S22 & S22 & S00 ; end behavior;
3.2.4. Khối MixColumn
Đây là khối có cấu tạo phức tạp nhất trong các khối chức năng của hệ thống AES. Sơ đồ khối của MixColumn như sau :
Hai khối Demux_4 và Mux_4 thực hiện tương tự như khối Demux và Mux trong khối ShiftRow ở trên. Các khối SubMixColumn lần lượt biến đổi các byte trong các cột tương ứng.
Việc thực hiện khối SubMixColum dựa trên các khối XOR_8 và khối Xtime. Khối XOR_8 thực hiện phép XOR với hai đầu vào 8 bit. Khối Xtime thực hiện phép nhân với x như đã mô tả trong chương II.
Hình 3.11.Khối Xtime
Code VHDL: process (d_in) begin
if d_in(7)='0' then
d_out<=d_in(6 downto 0) & '0'; else
d_out<=(d_in(6 downto 0) & '0') xor "00011011"; end if;
end process;
Sau đây là sơ đồ khối của Mix_Column :
Byte b0 của đầu ra được tính toán theo phương trình : b0 = ‘02’•a0 ⊕ ‘03’•a1 ⊕ ‘01’ • a2 ⊕ ‘01’•a3
Hình 3.12.Phép biến đổi theo dòng
Với các đầu ra khác như b1, b2, b3 , thực hiện tương tự, chỉ cần thay đổi thứ tự đầu vào, ta được các phép biến đổi “dòng” :
b1 = ‘01’•a0 ⊕ ‘02’•a1 ⊕ ‘03’ • a2 ⊕ ‘01’•a3 b2 = ‘01’•a0 ⊕ ‘01’•a1 ⊕ ‘02’ • a2 ⊕ ‘03’•a3 b3 = ‘03’•a0 ⊕ ‘01’•a1 ⊕ ‘01’ • a2 ⊕ ‘02’•a3
Kết hợp các phép biến đổi “dòng” trên ta có khối SubMixColumn.
3.4. Thiết kế các khối chức năng của bộ giải mã
Các khối chức năng của bộ giải mã có thể thực hiện một cách hoàn toàn tương tự như bộ mã hóa. Tuy nhiên khối InverseMixColumn thì thực hiện phức tạp hơn rất nhiều do phải thực hiện các phép nhân với các chỉ số rất lớn: Nhân với 09h, 0Bh, 0Dh, 0Eh thay vì các phép nhân 01, 02, 03 ở bộ mã hóa.
Hình 3.13.Khối SubMixColumn
3.4.1. Nhân với 09h
Phép nhân với 09h ( 9 = 8 + 1) thực hiện như sau :
Hình 3.14.Khối nhân 09h
3.4.2. Phép nhân với 0Bh
Phép nhân với 0Bh ( B = 8 + 2 + 1)thực hiện như sau :
3.4.2. Phép nhân với 0Dh
Phép nhân với 0Dh ( D = 8 + 4 + 1) thực hiện như sau :
Hình 3.16.Khối nhân 0Dh
3.4.3. Phép nhân với 0Eh
Phép nhân với 0Eh ( E = 8 + 4 + 2 ) thực hiện như sau :
Hình 3.17. Phép nhân 0Eh
Thực hiện tương tự như bộ mã hóa với các phương trình sau :
0, 0, 1, 2, 3, 1, 0, 1, 2, 3, 2, 0, 1, 2, 3, 3, 0, 1, 2, 3, '0 ' '0 ' '0 ' '09 ' '09 ' '0 ' '0 ' '0 ' '0 ' '09 ' '0 ' '0 ' '0 ' '0 ' '09 ' '0 ' c c c c c c c c c c c c c c c c c c c c b e a b a d a a b a e a b a d a b d a a e a b a b b a d a a e a = • ⊕ • ⊕ • ⊕ • = • ⊕ • ⊕ • ⊕ • = • ⊕ • ⊕ • ⊕ • = • ⊕ • ⊕ • ⊕ •
Kết quả cuối cùng là khối InverseMixColumn có kết cấu tương tự như MixColumn của bộ mã hóa :
Hình 3.18. Khối InverseMixColumn 3.4. Thiết kế chi tiết cho khối KeyExpansion
Sơ đồ thiết kế khối KeyExpansion trên VHDL :
Hình 3.19.Sơ đồ khối KeyExPansion
Chi tiết các khối như sau :
3.4.1. Khối RotWord
Khối RotWord được thực hiện đơn giản theo đoạn code VHDL sau:
d_out(7 downto 0) <= d_in(15 downto 8) ;
d_out(15 downto 8) <= d_in(23 downto 16) ;
d_out(23 downto 16) <= d_in(31 downto 24) ;
d_out(31 downto 24) <= d_in(7 downto 0) ;
end behavior ;
Hình 3.20.Khối RotWord
3.4.2. Khối SubWord
Khối SubWord chính là bốn khối SubByte ghép lại với nhau
Hình 3.21. Khối SubWord
3.4.3. Khối Rcon
Đoạn code VHDL sau thực hiện chức năng của khối Rcon : process (req_key_in) begin case req_key_in is when “1” => rcon_out <= “01000000” ; when “2” => rcon_out <= “02000000” ; when “3” => rcon_out <= “04000000” ; when “4” => rcon_out <= “08000000” ; when “5” => rcon_out <= “10000000” ;
when “6” => rcon_out <= “20000000” ; when “7” => rcon_out <= “40000000” ; when “8” => rcon_out <= “80000000” ; when “9” => rcon_out <= “1b000000” ; when “10” => rcon_out <= “36000000” ; when others => null ;
end case; end process;
Hình 3.22.Khối Rcon
3.4.4. Khối KeyStorage
Khối KeyStorage có chức năng lưu trữ từ khóa gốc và các tứ khóa phái sinh tạo ra. Đồng thời nó cũng có nhiệm vụ đưa ra các từ khóa thích hợp theo yêu cầu của bộ mã hóa hay giải mã.
Hình 3.23.Khối KeyStorage
Đoạn chương trình sau mô tả hoạt động của khối KeyStorage : key_process: process(clk,req_key_in)
begin
if clk’event and clk=’1’ then key0 <= O_key;
case req_key_out is
when “0010” => key2 <= S_key; …
when “1010” => key10 <= S_key;
when others => null ; end case;
end if; end process;
data_process: process (clk, mode,req_key_out) begin
if mode = ‘0’ then --Ma hoa
if clk’event and clk =’1’ then case req_key_out is
when “0001” => key_out <= key1 ;
when “0010” => key_out <= key2 ;
…
when “1010” => key_out <= key10 ;
when others => null ; end case;
end if;
else --Giai ma
if clk’event and clk =’1’ then case req_key_out is
when “0001” => key_out <= key10 ;
when “0010” => key_out <= key9 ;
…
when “1010” => key_out <= key1 ;
when others => null ; end case;
end if; end process;
3.4.5. Khối DemuxKey
Khối DemuxKey có nhiệm vụ nhận chìa khóa gôc (O_key) và các từ khóa phái sinh hồi tiếp rồi phân chia chúng thành các word cho vòng sinh khóa tiếp theo.
Hình 3.24. Khối DemuxKey
3.5. Khối diều khiển bộ giải mã và bộ giao tiếp với máy tính3.5.1. Khối CPU - điều khiển bộ giải mã 3.5.1. Khối CPU - điều khiển bộ giải mã
Khối CPU có nhiệm vụ nhận dữ liệu từ khối giao tiếp với máy tính, phân loại dữ liệu thành hai đường: data và key dựa trên tín hiệu select. Sau đó CPU tạo ra các tín hiệu req_key_in và req_key_out để điều khiển khối KeyExpansion và khối Data. Ngoài ra khi nhận được tín hiệu Reset thì khối CPU sẽ trở về trạng thái khơi tạo ban đầu :
Hình 3.25.Khối CPU
Trường hợp select = “01” – Quá trình xử lí Key.
Hình 3.26.Giản đồ thời gian điều khiển vòng key
Trường hợp select = “10” – Quá trính xử lí Data
Hình 3.27. Giản đồ thời gian điều khiển vòng data
Chương trình VHDL của CPU như sau : cpu_process: process(select) begin case select is when “01” => temp_key <= ‘1’ ; temp_data <= ‘0’; when “10” => temp_key <= ‘0’ ; temp_data <= ‘1’ ; when others => null ;
end process ;
key_process: process(temp_key, clk) begin
temp_req_key_in <= ‘0000’ ; if temp_key = ‘1’ then
if clk’event and clk = ‘1’ then
if temp_req_key_in = “1111” then null ;
else if temp_req_key_in = “1010” then temp_req_key_in <= “1111” ; else temp_req_key_in <= temp_req_key_in +1 ; end if ; end if ; end if ; end process ; data_process: process(temp_data, clk) begin temp_req_key_out <= ‘0000’ ; if temp_key = ‘1’ then
if clk’event and clk = ‘1’ then
if temp_req_key_out = “1111” then null ;
else if temp_req_key_out = “1010” then temp_req_key_out <= “1111” ; else
temp_req_key_out <= temp_req_key_out +1 ; end if ;
end process ;
req_key_in <= temp_req_key_in ; req_key_out <= temp_req_key_out ;
3.5.2. Khối giao tiếp với máy tính
Hệ thống AES giao tiếp với máy tính thông qua cổng RS232. Dữ liệu cần mã hóa ( giải mã ) và từ khóa tương ứng sẽ được truyền từ máy tính xuống Kit thông qua cổng COM. Sau khi hoàn tất quá trình mã hóa ( giải mã ) dữ liệu Ta xây dựng khối giao tiếp với máy tính dựa trên khối RX có sẵn của Xilinx Inc. Sau khối RX là khối đệm dữ liệu. Như ta đã biết đầu vào của khối AES là 128 bit trong khi dữ liệu nhận từ cổng COM là 8 bit do đó cần có khối đệm dữ liệu này. Để phân biệt đâu là từ chìa khóa đâu là dữ liệu cần mã hóa ( giải mã ) ta phải gửi thêm một byte đồng bộ: Nếu là byte “01”h thì đó là từ khóa, nếu là byte “02”h thì đó là dữ liệu.
Hình vẽ sau mô tả khối giao tiếp với máy tính:
KẾT LUẬN
Sau khi tìm hiểu và hoàn thành đồ án em đã bước đầu nắm bắt được kiến thức cơ bản về FPGA và ngôn ngữ mô tả phần cứng VHDL. Bên cạnh đó đồ án cũng giúp em hiểu thêm về mã hoá AES mà ngày được ứng dụng rất rộng rãi trong các lĩnh vực công nghệ số hoá .
Các ứng dụng của FPGA ngày càng trở nên phong phú : 1. Trong giao dịch điện tử:
- Thương mại điện tử; - Ngân hàng;
- Giao dịch an toàn; - Các điểm bán lẻ. 2. Trong thông tin liên lạc:
- Mạng lưu trữ vùng; - Mạng riêng ảo; - Hội nghị truyền hình; - Các dịch vụ thoại. 3. Môi trường bảo mật:
- Thông tin vệ tinh;
- Hệ thống mạng bảo mật.
Tuy nhiên, do thời gian cũng như khả năng nghiên cứu còn có hạn nên bản đồ án này cũng không tránh khỏi thiếu sót, vì vậy em mong rằng sẽ nhận được sự đóng góp của các thầy cô để đề tài này được hoàn thiện hơn.
Một lần nữa em xin bày tỏ lòng biết ơn tới các thầy cô giáo trong khoa Điện Tử Viễn Thông đã tạo điều kiện cho em hoàn thành đồ án.
TÀI LIỆU THAM KHẢO
[1] Xilinx Inc, Programmable Logic Design - Logic Hand Book.pdf 2003 [2] Peter J.Anshenden, VHDL cook book , 1990
[3] NIST, Anouncing Advanced Encryption Standard Federal, Information Processing Standard 2001.
[4] Cryptography Research, DPA Workstation Factsheet 2005. [5] http://en.wikipedia.org/wiki/Advanced_Encryption_Standard [6] http://en.wikipedia.org/wiki/ VHDL
[7] http://www.xilinx.com/support/library.htm [8] http://www.fpga4fun.com