Tải bản đầy đủ (.pdf) (31 trang)

Đồ án thiết kế hệ thống số: Xây dựng bộ mã hóa và giải mã dữ liệu dựa trên thuật toán Aes trên nền tảng công nghệ Fpga

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (816.6 KB, 31 trang )

ĐỒ ÁN THIẾT KẾ HỆ THỐNG SỐ
ĐỀ TÀI
XÂY DỰNG BỘ MàHÓA VÀ GIẢI MàDỮ LIỆU DỰA 
TRÊN THUẬT TOÁN AES TRÊN NỀN TẢNG CÔNG 
NGHỆ FPGA

Nhóm:     6
Sinh viên thực hiện:
Trần Quốc Tuân

B13DCDT082

Đỗ Thị Thảo

B13DCDT122

Đỗ Thanh Huy

B13DCDT063

Cù Quang Anh

B13DCDT046


MỤC LỤC

LỜI NÓI ĐẦU .........................................................................................................2
PHẦN I : LÝ THUYẾT CƠ SỞ..............................................................................3
I. Tổng quan về PLD và FPGA..............................................................................3
 1.  Giới thiệu về cấu kiện logic khả trình (PLD)..................................................3


 2.  FPGA................................................................................................................. 4
 3.  Các bước thiết kế cho FPGA............................................................................5
 4.  Giới thiệu chung về FPGA của Xilinx.............................................................7
 5.  Tìm hiểu về phần mềm ISE của Xilinx...........................................................8
II. UART.................................................................................................................... 9
 1.  UART nhận.......................................................................................................9
 2.  UART truyền.....................................................................................................10
III. Thuật toán AES.................................................................................................11
 1.  Giới thiệu về chuẩn mã hóa tiên tiến AES.......................................................11
 2.  Quy trình mã hóa ..............................................................................................11
 3.  Quy trình giải mã...............................................................................................17
PHẦN II: XÂY DỰNG BỘ  MàHÓA VÀ GIẢI MàDỮ  LIỆU DỰA TRÊN 
THUẬT   TOÁN   AES   TRÊN   NỀN   TẢNG   CÔNG   NGHỆ   FPGA
....................................................................................................................................
18
I. Đặt vấn đề............................................................................................................18
II. Thiết kế phần cứng...........................................................................................19

2


 1.  UART Receiver..................................................................................................20
 2.  UART Transmitter.............................................................................................25
 3.  AES encoder/decoder.........................................................................................29
III. Kiểm tra kết quả..............................................................................................35
LỜI NÓI ĐẦU

Trong mật mã học, AES (viết tắt của từ tiếng Anh: Advanced Encryption 
Standard, hay Tiêu chuẩn mã hóa tiên tiến) là một thuật toán mã hóa 
khối được chính phủ Mỹ áp dụng làm tiêu chuẩn mã hóa. AES được kỳ vọng áp 

dụng trên phạm vi thế giới ,đã được nghiên cứu rất kỹ lưỡng và được chấp thuận 
làm tiêu chuẩn liên bang bởi Viện tiêu chuẩn và công nghệ quốc gia Hoa kỳ (NIST) 
sau một quá trình tiêu chuẩn hóa kéo dài 5 năm . Vậy nên thuật toán AES là một 
thuật toán có thể áp dụng cho nhiều mục đích . 
Để nghiên cứu thuật toán AES, ta sẽ nghiên cứu tới những khái niệm có liên quan 
là nền tảng để xây dựng nên bộ cấu trúc và giải mã trước.  Sau khi có được những 
khái niệm cơ bản đó, chúng ta sẽ tìm hiểu về cách xây dựng bộ mã hóa và giải mã 
dựa trên thuật toán AES trên nền tảng FPGA. Sau đó chúng ta sẽ tìm hiểu cách thiết 
kế phần cứng, và việc truyền và nhận qua cổng UART.
Cuối cùng là chương trình mô phỏng việc mã hóa và giải mã dựa trên thuật toán 
AES dựa trên nền tảng FPGA, thông qua ví dụ cụ thể, qua đó chúng ta sẽ thấy 
được khả năng ứng dụng của công nghệ này trong thực tế.

3


PHẦN I: LÝ THUYẾT CƠ SỞ

I.

Tổng quan về PLD và FPGA.

1. Giới thiệu về cấu kiện logic khả trình (PLD).
Vào cuối thập kỷ 70 thế kỷ XX, các thiết bị logic chuẩn xuất hiện ồ ạt, đi kèm  
với đó là sự  xuất hiện mạch in. Người ta đặt ra câu hỏi: “Chuyện gì xảy ra nếu 
người thiết kế có thể thực hiện các kết nối khác nhau trong một thiết bị lớn hơn?”.  
Điều này cho phép người thiết kế tích hợp nhiều thiết bị logic chuẩn trong một linh  
kiện. Để  có thiết kế  linh hoạt nhất, nhà sản xuất Ron Cline từ  Signetics đưa ta ý  
tường dùng hai ma trận kết nối khả trình. Hai ma trận kết nối khả trình này có thể 
tổ  hợp tùy ý giữa các cổng AND và cổng OR, đồng thời cho phép nhiều cổng OR  

cùng sử  dụng chung một cổng AND. Kiến trúc này rất linh hoạt, nhưng tại thời  
điểm đó, trễ lan truyền từ đầu vào tới đầu ra khá cao nên thiết bị hoạt động tương  
đối chậm và dạng công nghệ  logic khả  trình đầu tiên xuất hiện đó chính là SPLD. 
Sau này công nghệ CPLD và FPGA ra đời có mật đọ tích hợp cao hơn, cấu trúc linh  
hoạt hơn cho phép tạo ra nhiều mạch logic phức tạp hơn.
Cấu kiện logic khả  trình, viết tắt là PLD là loại cấu kiện điện tử  có nhiều  ưu 
điểm và hiện nay đang được phát triển rất mạnh. Về nguyên lý, chúng có cấu tạo 
rất giống với PROM. Việc lập trình cho PLD có thể được thực hiện bằng các công 
nghệ khác nhau, dựa trên cơ sở bẻ cầu trì hoặc chuyển mạch. Tuy nhiên, ứng dụng 

4


PLD lại rất khác với PROM. Một PLD, được tạo thành bằng một số  cổng AND, 
OR, XOR hoặc cả các Flip­Flop, có thể thực hiện nhiều hàm Boole khác nhau.

2. FPGA.

Năm   1985, 
công ty Xilinx đưa ra ý tưởng hoàn toàn mới, đó là kết hợp thờ gian hoàn thành sản 
phẩm và khả năng điều khiển được của PLD với mật đọ và ưu thế về chi phí của  
GateArray. Từ đó, FPGA ra đời.

Cấu trúc FPGA đơn giản gồm các tế bào logic, các khối cách đều nhau, liên kết  
nhờ  các đường kết nối có thể  thay đổi được theo yêu cầu của người thiết kế.  
Nghĩa là người thiết kế  có quyền thiết kế, lập trình và thay đổi mạch điện. Hiện 

5



nay FPGA có mật độ  khá cao, lên tời hàn trăm tỷ  cổng và cấu trúc cũng đa dạng  
phức tạp hơn. Nhiều chức năng phức tạp đã đượ tích hợp sẵn để tằn hiệu quả  sử 
dụng FPGA.
Có hai loại FPGA cơ bản: Loại lập trình lại được, dựa trên công nghệ SRAM và 
loại lập trình một lần. 

3. Các bước thiết kế cho FPGA.
Bước 1: Nhập thiết kế (Design Entry)
Các công cụ thiết kế cho phép nhập thiết kế theo các cách:

­ Nhập thiết kế theo sơ đồ  nguyên lý Schematic: Người thiết kế  sử dụng các 
mô­đun sẵn có trong thư  viện Schematic để  ghép nối chúng với nhau tạo 
thành bản thiết kế theo yêu cầu. Từ  sơ đồ  nguyên lý đã thiết kế  được công  
cụ phần mềm sẽ chuyển đổi sang file ngôn ngữ  mô tả  phần cứng HDL, mà 
phổ biến là VHDL hoặc Verilog.

­ Nhập thiết kế  sử  dụng ngôn ngữ  mô tả  phần cứng HDL (VHDL):   Người 
thiết kế  sử  dụng chương trình soạn thảo để  thực hiện việc mô tả  toàn bộ 
bản thiết kế của mình dưới dạng ngôn ngữ HDL.

­ Nhập thiết kế dưới dạng sơ đồ: Công cụ  thiết kế  còn cho phép nhập thiết 
kế  vào dưới dạng sơ  đồ  mà điển hình là đồ  hình trạng thái FSM, sau đó  
chúng cũng được chuyển đổi sang HDL.
Bươc 2: Kiểm tra thiết kế (Design Verification)
Thực hiện kiểm tra, mô phỏng chức năng hoạt động của thiết kế HDL đã tạo ra 
ở trên. Bước này có thể không cần phải thực hiện trong khi thiết kế.
Bước 3: Tổng hợp thiết kế (Design Synthesis)

6



Sau khi hoàn thành mô phỏng thiết kế, bước tổng hợp tiếp theo có nhiệm vụ 
chuyển thiết kế dưới dạng file văn bản HDL thành dạng file Netlist, thực hiện mô 
tả mạch thực ở mức thấp dưới dạng cổng logic và kết nối chúng với nhau.
Bước 4: Thực hiện thiết kế (Design Implementation)
Bước   này sử   dụng file  Netlist  và   file   ràng buộc   “constrains  file”  (mô   tả  các 
nguyên tắc thiết kế, các ràng buộc về vật lý như  gán vị  trí cho các đầu vào/ra trên  
chip, các ràng buộc về  tốc độ, thời gian, tần số…) để  tạo thiết kế  sử  dụng tài  
nguyên có sẵn của FPGA. Bước này bào gồm các bước:  Translate, Map, Place and  
Routing.

­ Translate:  Bước   này  nhằm  thực   hiện  kiểm  tra   thiết   kế   và   đảm   bảo  file  
Netlist   phù   hợp   với   kiến   trúc   FPGA   đã   chọn,   kiểm   tra   file   ràng   buộc 
“constraints file” của người sử dụng để phát hiện các lỗi mâu thuẫn với tham 
số của FPGA đã chọn. Translate thường bao gồm các quá trình: Tối  ưu hóa, 
biên dịch thành các thành phần vật lý của cấu kiện; kiểm tra ràng buộc thiết  
kế. Khi kết thúc Translate , sẽ có một bản báo cáo về các chương trình được 
sử  dụng, danh sách các cổng I/O và các cấu kiện được sử  dụng trong thiết 
kế.

­ Map: Tạo bản phân bố  thiết kế  tới các tài nguyên cụ  thể  trong FPGA. Nếu  
thiết kế  quá lớn so với thiết bị  được chọn, quy trình này không thể  hoàn  
thành nhiệm vụ của mình. Quá tình Map có các tham số rạng buộc của thiết 
kế, ví dụ  như  tham số  tốc độ, thời gian của thiết kế  và đôi khi quyết định  
gắn thêm các thành phần logic để  đáp  ứng các yêu cầu về  thời gian. Bước 
này nhằm đưa mạch thiết kế vào một thiết bị cụ thể. Bước này cũng tạo ra  
báo cáo xác nhận các tài nguyên sử  dụng trong chip, mô tả  chính xác các  
thành phần trong thiết kế được đặt ở vị trí nào trong chip thực tế.

­ Place and Routing: Place là quá trình lựa chọn vị  trí phù hợp của mỗi khối  

chức năng trong thiết kế  và đưa các cổng logic của phần đó vào các khối 
logic hay các mô­đun cụ  thể  trong FPGA trên cở  sở  tối  ưu việc kết nối và 

7


đảm bảo về các ràng buộc về thòi gian. Route là quá trình tạo liên kết vật lý 
giữa các khối logic. Sau bước này tạo ra được file mô tả cấu hình dạng *.jed.
Bước 5: Mô phỏng định thời (Timing Simulation)
Sau bước Place and Routing người thiết kế có thể thực hiện mô phỏng thiết kế 
ở mức cổng logic đã được định vị trí và định tuyến trên FPGA, phần mềm sử dụng  
file cấu hình đã được tạo ra và kết hợp với thư  viện về mô hình thời gian của các 
họ FPGA (ví dụ ISE của xilinx dùng thư viện VITAL), để thực hiện mô phỏng hoạt 
động của thiết kế  mà có tính đến các tham số  thời gian trễ, thời gian thiết lập…  
của các cổng logic trong FPGA. Bước này rất quan trong với những thiết kế phức  
tạp, tốc độ lớn.
Bước 6: Cấu hình (Configuration)
Gọi chương trình điều khiển việc nạp cấu hình, thực hiện kết nối thiết bị nạp  
đến FPGA và nạp file cấu hình cho FPGA. Khác với CPLD, FPGA có thêm bước  
“Creat Bit file” để tạo ra file “luồng bit” để nạp vào bộ  nhớ  cấu hình trong FPGA  
thường là bộ nhớ tạm như SRAM.

4. Giời thiệu chung về FPGA của xilinx.
Công nghệ FPGA đang được phát triển rất mạnh trên thế giới. Hiện nay Xilinx 
là hãng đi đầu trong công nghệ FPGA, sản phẩm của Xilinx bao gồm: các vi mạch 
CPLD và FPGA, phần mềm thiết kế, các dịnh vụ  hỗ  trợ  thiết kế  và các chương 
trình nguồn.
Xilinx cung cấp 2 dòng FPGA là Spartan và Virtex.
FPGA Spartan sử dụng trong những  ứng dụng với số lượng lớn giá thành thấp, 
thương sử  dụng để  thay thế  cho mảng cổng logic cố  định và cho các sản phẩm  

dùng cho từng ứng dụng cụ thể.

a) Spartan­3

8


Dòng FPGA Spartan­3 được thiết kế cho các ứng dụng tiết kiệm chi phí. So với 
các dòng FPGA trước đó, dòng Spartan­3 được tăng thêm về  tài nguyên logic, dung  
lương RAM, số I/O và khả năng quản lý tín hiệu clock.
Các tính năng chính:

­ Giá thành thấp.
­ Mật độ logic cao, có thể lên tới 74.880 cells.
­ Số lương I/O lớn, tối đa 784 chân.
­ Tốc độ truyền dữ liệu I/O lớn.
­ Hỗ trợ nhiều chuẩn giao tiếp.
­ Kết cuối bằng DCI (trở kháng điều khiển số).
­ Hỗ trợ DDR, DDR2 SDRAM.
­ Có các bộ chân nhúng 18X18.
­ Có quản lý tín hiệu clock DCM.
­ Hỗ trợ các nhân vi xử lý nhúng MicroBlaze và PicoBlaze.
Các đặc điểm kiến trúc:
Cấu tạo của Spartan­3 có các thành phần tương tự như các FPGA khác:

­ Các khối logic có thể cấu hình được là các khối LUT dang RAM. Chức năng  
của các khối này là để thiết lập các logic và các khối lưu trữ có thể là Flip­
Flop hoặc Latch.

­ Các khối I/O (IOB) có chắc năng điều khiển dữ liệu giữa các chân I/O và các  

khối logic bên trong cấu kiện. Mỗi khối IOB có thể  hỗ  trợ  dữ  liệu 2 chiều  
hoặc hoạt động ở 3­trạng thái.

­ Các khối RAM ở dạng 18kbit.
Ngoài ra Spartan­3 có thêm các thành phần

9


­ Các khối nhân nhúng cứng 18X18bit.
­ Các khối quản ls tín hiệu clock số  DCM cung câp các khả  năng phân phối, 
trễ, nhân, chia và điều khiển pha của tín hiệu clock.

5. Tìm hiểu về phần mềm ISE của xilinx.
Không chỉ là nhà cung cấp các chip logic khả trình CPLD/FPGA, Xilinx còn cung 
cấp các công cụ  thiết kế  điện tử  hoàn chỉnh, cho phép thực hiện thiết kế  trên các  
thiết bị logic khả trình của hãng. Các công cụ này kết hợp công nghệ CAD tiên tiến  
với giao diện đồ họa linh hoạt, dễ sử dụng để người thiết kế có được thiết kế tối  
ưu. Bộ công cụ phần mềm hiện đang được sử dụng rộng rãi là ISE.

II.

UART.

10


UART là một mạch điện thực hiện gửi dữ  liệu song song thông qua một kênh 
nối tiếp. UART bao gồm bộ truyền và bộ nhận. Bộ truyền về cơ bản là một thanh 
ghi dịch đặc biệt, lấy dữ liệu song song sau đó dịch từng bít ra ngoài với tốc độ định  

trước. Ngược lại, bộ nhận dịch từng bít dữ  liệu nhận được và sau đó phục hồi lại  
dữ liệu.
Khi ở trạng thái nghỉ, kênh nối tiếp ở mức ‘1’. Quá trình truyền bắt đầu với một 
bít start khi kênh xuống mức ‘0’, theo sau là các bit data, prity và bít stop, lúc này 
kênh ở mức ‘1’ và trở về trạng thái nghỉ sau bít stop. Số lượng bit dữ liệu có thể là  
6, 7, hoặc 8 bít. Bít parity được dùng để gỡ lỗi.

Đối với UART tín hiệu clock đồng bộ  không được gửi kèm các khung dữ  liệu.  
Do đó, trước khi quá trình truyền bắt đầu, bộ truyền và nhận phải thỏa thuận trước 
với nhau một tập các tham số bao gồm tốc độ baud (số bít trên giây), số bít data và  
stop, có sử dụng bít parity hay không…

1. UART nhận
Do không có xung clock đồng bộ, bộ  nhận sử dụng các tham số xác định trước 
để truyền dữ liệu. Bộ nhận sử dụng một mạch lấy mẫu để ước lượng điểm giữa  
của bit và sau đó khôi phục lại bít.

11


Tốc độ lấy mẫu phổ  biến nhất là 16 lần tốc độ  baud, nghĩa là mỗi bít nối tiếp 
được lấy mẫu 16 lần. Mạch lấy mẫu sẽ làm việc như sau:
Ban đầu kênh  ở  trạng thái nghỉ  và  ở  mức ‘1’, mạch lấy mẫu  
sẽ đợi cho đến khi kênh được kéo xuống mức ‘0’, bắt đầu bít start. Bộ đếm 
bên trong mạch lấy mẫu sẽ đếm số mẫu đã lấy.
Khi bộ đếm tăng đến 7, tín hiệu đến đạt tới điểm giữa của bit  
start (do 1 bit start tương đương 16 mẫu). Bộ đếm được khởi động lại.
Tiếp theo bộ   đếm tiếp tục đếm số  mẫu đã lấy, khi đếm tới 
15, tín hiệu đến đạt tới điểm giữa của bít data đầu tiên. Giá trị  của bít này 
sẽ được lấy tại điểm lấy mẫu này. Dịch bít này vào thanh ghi và khởi động  

lại bộ đếm.
Lặp lại bước 3 N­1 lần nữa (N là số  bít data) để  nhận các bít  
data còn lại.
Nếu bít parity được sử  dụng, lặp lại bước 3 một lần nữa để 
lấy bit parity.
Lặp lại bước 3 M (M là số bít stop) lần để thu được bit stop.
Mạch lấy mẫu về  cơ  bản thực hiện chức năng của tín hiệu clock. Thay vì sử 
dụng sườn dương của tín hiệu clock để  chỉ  thị  khi nào thì tín hiệu đầu vào là hợp  
lệ. Nó tận dụng mạch lấy mẫu để ước lượng điểm giữa của mỗi bít. Trong khi bộ 
nhận không có thông tin chính xác về thời gian của bít start, điểm giữa  ước lượng  
của mỗi bít sai lệch nhiều nhất là 1/16. Với quá trình lấy mẫu, do tốc độ  baud có 
thể  được chia nhỏ  từ  tốc độ  clock hệ  thống, nên mạch này không được ứng dụng 
với tốc độ dữ liệu cao.

2. UART truyền.

12


UART truyền về cơ bản là một thanh ghi dịch, dịch ra ngoài từng bít dữ liệu tại  
một tốc độ  chỉ  định trước. Tốc độ  được điều khiển bằng mạch lấy mẫu. Do tín  
hiệu gửi không đi kèm với clock đồng bộ nên tốc độ  lấy mẫu bằng 16 lần tốc độ 
baud nhưng quá trình lấy mẫu gửi chậm hơn so với UART nhận. Bộ UART truy ền  
sử dụng một bộ đếm để theo dõi số mẫu, mỗi bít được dịch ra ngoài sau 16 lần lấy  
mẫu.
Sau khi xác nhận tín hiệu tx_signal là tín hiệu yêu cầu bộ  truyền thực hiện  
truyền, Máy trạng thái hữu hạn sẽ lấy từ  dữ  liệu (7 bits) và sau đó thực hiện dần  
dần thông qua các trạng thái start, data, stop để dịch ra ngoài các bít tương ứng. Tín 
hiệu báo hoàn thành bằng cách thiết lập tín hiệu tx_done_tick cho 1 chu kỳ truyền.  
Một bít đệm, tx_reg, được sử dụng để truyền.


III.

Thuật toán AES.

1. Giới thiệu về chuẩn mã hóa tiên tiến AES.
Chuẩn mã hóa dữ liệu tiên tiến AES (Advanced Encryption Standard) là một hệ 
mã khóa bí mật có tên là Rijdael (do hai nhà mật mã học người Bỉ là Joan Daemen 
và Vincent Rijmen đưa ra và trở thành chuẩn từ năm 2002) cho phép xử lý các khối 
dữ  liệu input có kích thước 128 bit sử  dụng các khóa có độ  dài 128, 192 hoặc 256  
bit.  Trong AES các phép toán cộng và  nhân được thực hiện trên các  byte  trong 
trường hữu hạn GF(

2. Quy trình mã hóa.
Quy trình mã hóa sử dụng bốn phép biến đổi chính:
AddRoundKey: cộng  mã khóa của chu kỳ vào trạng thái hiện hành. Độ  dài 
của mã khóa của chu kỳ bằng với kích thước của trạng thái.
SubBytes: thay thế  phi tuyến mỗi byte trong trạng thái hiện hành thông qua 
bảng thay thế (S­box).

13


MixColumns: trộn thông tin của từng cột trong trạng thái hiện hành. Mỗi cột 
được xử lý độc lập.
ShiftRows : dịch chuyển xoay vòng từng dòng của trạng thái hiện hành với 
di số khác nhau.
Quy trình mã hóa được tóm tắt lại như sau:
Thực hiện thao tác AddRoundKey đầu tiên trước khi thực hiện các chu kỳ 
mã hóa.

N ­ 1 chu kỳ mã hóa bình thường, mỗi chu kỳ bao gồm bốn bước biến đổi 
liên tiếp nhau: SubBytes, ShiftRows, MixColumns, và AddRoundKey.
Thực hiện chu kỳ mã hóa cuối cùng: trong chu kỳ này thao tác MixColumns 
được bỏ qua. 

a) Phép biến đổi SubBytes
Các  byte  được thế  thông qua bảng tra  S­box.  Đây chính là quá trình phi tuyến 
của thuật toán. Hộp S­box này được tạo ra từ  một phép biến đổi khả nghịch trong 
trường hữu hạn GF (28) có tính chất phi tuyến. Để chống lại các tấn công dựa trên 
các đặc tính đại số, hộp S­box này được tạo nên bằng cách kết hợp phép nghịch  
đảo với một phép biến đổi affine khả  nghịch. Hộp S­box này cũng được chọn để 
tránh các điểm bất động (fixed point). 

14


Bước này biến đổi mỗi byte trong ma trận thành byte ở vị trí hàng là 4 bít trước 
của byte và cột là 4 bít sau của byte trong s­box.

15


b) Phép biến đổi ShiftRows

Các   hàng   được 
dịch vòng một số  bước nhất định. Đối với AES, hàng đầu được giữ  nguyên. Mỗi  
byte của hàng thứ  2 được dịch vòng trái một vị  trí. Tương tự, các hàng thứ  3 và 4 
được dịch vòng 2 và 3 vị trí. Do vậy, mỗi cột khối đầu ra của bước này sẽ bao gồm 
các byte ở đủ 4 cột khối đầu vào. Đối với Rijndael với độ dài khối khác nhau thì số 
vị trí dịch chuyển cũng khác nhau


c)

Phép

 

biến

 

đổi  

MixColumns
Bốn byte trong từng cột được kết hợp lại theo một phép biến đổi tuyến tính khả 
nghịch. Mỗi khối 4 byte đầu vào sẽ  cho một khối 4 byte  ở đầu ra với tính chất là 
mỗi byte ở đầu vào đều ảnh hưởng tới cả 4 byte đầu ra. Cùng với bước ShiftRows,  

16


MixColumns đã tạo ra tính chất khuyếch tán cho thuật toán. Mỗi cột được xem như 

một đa thức trong trường hữu hạn và được nhân với đa thức  c ( x )   = 3x3 + x2  +   x  + 2 
(modulo  x4  + 1).  Vì thế, bước nàycó thể  được xem là phép nhân ma trận trong  
trường hữu hạn. 
Bước này được mở  rộng và thực hiện nhân ma trận từ  bước shiftrows với ma  
trận các hệ số như quy tắc trên để thu được ma trận 128 bít đầu ra. Ma trận nhân:

d) Thao tác AddRoundKey


Tại   bước   này, 
khóa con được kết hợp với các khối. Khóa con trong mỗi chu trình được tạo ra từ 
khóa chính với quá trình tạo khóa con Rijndael; mỗi khóa con có độ  dài giống như 
các khối. Quá trình kết hợp được thực hiện bằng cách XOR từng bít của khóa con  
với khối dữ liệu.

e) thuật toán sinh khóa (KeyExpansion)
Là quá trình tạo các vòng khóa từ khóa chính, mỗi khóa con chứa 4 byte.  Giả sử 
ta có khóa ban đầu. Mạch tạo khóa sử dụng 128 bít khóa của vòng mã hóa trước làm  
đầu vào để tạo khóa.

17


 Quá trình tạo khóa như sau:
Lấy cột cuối cùng trong ma trận khóa và dịch byte đầu xuối dưới cùng. Và thế 
các byte trong cột này bằng các byte trong S­box như  bước subbytes, sau đó được  
xor từng bít với cột đầu tiên và cột thứ  i  ứng với vòng mã hóa thứ  i của ma trận 
Rcon. Kết quả là cột đầu tiên trong ma trận khóa kết quả của vòng i+1.
Tiếp đến ta xor lần từng bít của các cột 2­>4 của ma trận khóa đầu vào, với cột 
vừa tạo để tạo ra các cột còn lại cho ma trận khóa vòng i+1.

3. Quy trình giải mã
Quy trình giải mã được thực hiện qua các giai đoạn sau:
Thực hiện thao tác AddRoundKey đầu tiên trước khi thực hiện các chu kỳ 
giải mã.
Nr ­ 1 chu kỳ giải mã bình thường: mỗi chu kỳ  bao gồm bốn biến đổi liên 
tiếp nhau: InvShiftRows, InvSubBtes, AddRoundKey, InvMixColumns.
Thực   hiện   chu   kỳ   giải   mã   cuối   cùng.   Trong   chu   kỳ   này,   thao   tác 

InvMixColumns được bỏ qua.

a) Phép biến đổi InvShifRows
InvShiftRows chính là phép biến đổi ngược của phép biến đổi ShiftRows. Bước 
này dịch vòng ngược lại với bước ShifRows.

b) Phép biến đổi InvSuBytes
Phép biến đổi ngược của thao tác SubBytes, ký hiệu là InvSubBytes . Bước này 
hoạt động tương tự  như  bước SubBytes nhưng sử  dụng ma trận invS­box là ma  
trận nghịch với S­box.

18


c) Phép biến đổi InvMixColumns
InvMixColumns là biến đổi ngược của phép biến đổi MixColumns. Bước này 
thực hiện tương tự bước MixColumns nhưng ma trận nhân là nghịch đảo nhân trong  
bước MixColumns.

PHẦN II: XÂY DỰNG BỘ MàHÓA VÀ GIẢI MàDỮ LIỆU DỰA TRÊN 
THUẬT TOÁN AES TRÊN NỀN TẢNG CÔNG NGHỆ FPGA

I.

Đặt vấn đề.

Trong thời đại toàn cầu hóa hiện nay, vấn đề bảo mật an toàn thông tin internet 
trở nên hết sức cấp thiết. Có nhiều thuật toán được đưa ra nhằm bảo đảm an toàn 
thông tin trao đổi trên mạng internet. Tuy nhiên theo thời gian các thuật toán này dễ 
dàng bị  các đối tượng xấu khám phá và có thể  vô hiệu hóa với các mục đích khác 

nhau. AES (Advanced Encryption Standard) hay chuẩn mã hóa tiên tiến, là một thuật  
toán mã hóa khối  được chính phủ  Hoa Kỳ   áp dụng làm tiêu chuẩn mã hóa cho 
những giao dịch dân sự  qua internet được sử  dụng phổ  biến gần đây và vẫn thể 
hiện những  ưu việt của nó. Từ  đó việc thiết kế  IC thực hiện mã hóa/giải mã dựa  
trên thuật toán AES là rất cần thiết.
Mạch xây dựng về  cơ  bản yêu cầu một khối có nhiệm vụ  mã hóa và giải mã  
dựa trên thuật toán AES. Dữ  liệu mã hóa được đưa vào từ  Máy tính và gửi lên từ 
FPGA để  hiện thị kết quả nên cần một chuẩn giao tiếp giữa FPGA và PC để  trao 
đổi dữ liệu. Chuẩn giao tiếp được sử dụng trong thiết kế này là RS232. 

Chuẩn giao tiếp RS232 là một trong những kỹ  thuật được sử  dụng rộng rãi  
hiện nay để  nối ghép các thiết bị  ngoại vi với máy tính. Nó là một chuẩn giao 

19


tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều nhất là hai thiết bị , 
chiều dài kết nối lớn nhất cho phép để đảm bảo dữ liệu là 15m, tốc độ  20kbit/s. 
Các máy tính thường có một hoặc hai cổng nối tiếp theo chuẩn RS232 được gọi 
là cổng COM.  Để  làm việc với cổng RS232 ta sử  dụng bộ  truyền và nhận  
UART điểu khiển ghép nối PC và FPGA.
Thiết kế  được hoàn thiện sử  dụng VHDL và được thực thi trên Spartan­3 sử 
dụng công cụ thiết kế ISE 14.7.

II.

Thiết kế phần cứng.

Sơ đồ khối:


Giải thích các chân tín hiệu:
rx  :  Chân đầu vào dữ liệu qua cổng nối tiếp.
tx  :  Chân đầu ra dữ liệu qua cổng nối tiếp.
clk  :  Tín hiệu đồng bộ hệ thống.
rst :  Khởi động lại hệ thống. 
en  :  Chân cho phép truyền / nhận dữ liệu.
edsel 

:  Chân lựa chọn mã hóa / giải mã dữ liệu.

Mạch bao gồm 3 khối cơ bản là: UART Transmitter, UART Receiver, AES. Sau  
đây ta sẽ đi sâu vào thiết kế các khối cơ bản cho mạch mã hóa và giải mã.

20


1. UART Receiver
Để  thuận tiện cho việc thay đổi trong tương lai, hai hằng số  được sử  dụng là  
numdbit và numstopbit tương ứng là số bít data được truyền và số mẫu cho bit stop. 
Số mẫu cho bit stop có thể là 16, 24 và 32 tương ứng với thời gian của bit stop là 1,  
1.5 và 2 bít. Trong thiết kế của đề tài này numdbit = 8 và numstopbit = 16.
Thuật toán bao gồm 4 trạng thái chính là idle, start, data, stop tương  ứng biểu  
diễn giai đoạn xử lý của các bit start, data, stop. Tín hiệu s_tick là tín hiệu cho phép 
bộ tạo tốc độ  baud tạo ra tín hiệu lấy mẫu. Ở đây có hai bộ  đếm được biểu diễn  
bởi các thanh ghi s và n. Thanh ghi s duy trì theo dõi số lần lấy mẫu và đếm đến 7  
trong trạng thái start, tới 15 trong trạng thái data, và tới numstopbit trong trạng thái 
stop. Thanh ghi n duy trì theo dõi số bít dữ liệu đã nhận trong trạng thái data. Các bít  
nhận được được dịch vào và tập hợp lại trong thanh ghi b. Tín hiệu trạng thái 
rx_done_tick được thêm vào. Nó xác nhận cho một chu kỳ nhận đã hoàn thành. 


Sơ đồ khối của bộ UART nhận.

Giải thích các khối:
Khối “baud rate generator” tạo tốc độ baud để truyền và nhận 
các bít dữ liệu (19200 baud = 19200 bits/s). UART truyền thông không đồng 
bộ  do đó không có tín hiệu clock đồng bộ  đi kèm, như  vậy quá trình nhận 
phải được thỏa thuận trước thông qua tập các tham số. Để lấy mẫu các bít,  
bộ  nhận tạo ra một tín hiệu clock để  xác định điểm giữa của các bít đã 
truyền. Khối bau rate generator tạo ra một tín hiệu lấy mẫu tần số bằng 16 
lần tốc độ baud.

21


Khối “receiver” xác định các bits start, data, stop và chuyển bit  
dữ   liệu   vào   thanh   ghi   dịch   8   bit.   Sau   khi   nhận   xong   8   bits   tín   hiệu  
rx_done_tick được thiết lập báo đã nhận xong 8 bits, cần chuyển tới bộ mã  
hóa.
Khối “register” là một bộ  đệm tránh tình trạng ghi đè dữ  liệu 
trong khi chưa xử lý xong 8 bits dữ liệu trước đó.
Khối AES kiểm tra xem khi nào có 8 bits dữ  liệu mới gửi tới  
bộ  mã hóa bằng cách kiểm tra tín hiệu “rx_empty” xem đã được thiết lập  
hay chưa. Sau khi đã đọc xong 8 bits khối AES sẽ thiết lập tín hiệu rd_uart 
để xóa “rx_empty”.

Thuật toán thiết kế bộ nhận UART trong FPGA:

Giải thích thuật toán:  Ban đầu kênh  ở  trạng thái nghỉ, tín hiệu Rx= ‘1’. Bộ 
UART nhận liên tục lấy mẫu tín hiệu Rx gửi tới từ PC với tốc độ lấy mẫu bằng 16 
lần tốc độ  Baud, tốc độ  baud chọn trong thiết kế  này là 19200 baud, quá trình lấy  

mẫu tiếp tục cho đến khi mẫu đã lấy = ‘0’, lúc này PC báo cho bộ  nhận biết bắt  
đầu quá trình trao đổi dữ liệu. Bộ UART nhận sẽ tiếp tục lấy mẫu tín hiêu Rx để 
khôi phục dữ  liệu đến. Sau khi Rx=’0’, bộ  nhận chuyển sang trạng thái START. 
Nếu tín hiệu s_tick=’1’, bộ  nhận thực hiện lấy mẫu bit start, bộ đếm được khởi  
động tăng thanh ghi s. Khi s=7 nghĩa là quá trình lấy mẫu đã lấy mẫu đến điểm giữa 
của bit start. Thì bít start được khôi phục tại bộ  nhận, và khởi động lại bộ  đếm 
(s=0, n=0). Bộ nhận chuyển sang trạng thái data. Nếu tín hiệu cho phép s_tick=’1’,  
bộ nhận bắt đầu quá trình lấy mẫu các bit dữ liệu. Ban đầu khi mỗi mẫu được lấy,  

22


thanh ghi s sẽ tăng 1 cho đến khi tăng đến s=15, mẫu được lấy ở điểm giữa bit dữ 
liệu đầu tiên (do 8 mẫu trước đó của bít start chưa lấy nên cần 16 mẫu để bắt đầu 
từ điểm giữa của bit start đến điểm giữa của bit dữ liệu đầu tiên), bit dữ  liệu đầu  
tiên được khôi phục và dịch vào thanh ghi b, thanh ghi n tăng 1 cho biết đã nhận 
được 1 bit, bộ  đếm được khởi đông lại (s=0). Quá trình tiếp tục và các bit khôi 
phục được dịch dần vào thanh ghi b cho đến khi nhận được numdbit dữ liệu tương  
ứng với n=numdbit­1. Sau đó bộ nhận chuyển qua trạng thái STOP. Tùy thuộc vào  
số mẫu được lấy cho bit stop được quy định trong numstopbit, mà bộ đếm được lựa 
chọn cho phù hợp. Với số  mẫu là 16, bộ  nhận sẽ  khởi động bộ  đếm và đếm số 
mẫu để xác định điểm giữa của bit stop. Sau khi khôi phục lại bit stop, bộ nhận set  
tín hiệu rx_done_tick lên ‘1’ để báo quá trình nhận đã xong. Sau đó bộ nhận quay về 
trạng thái nghỉ để đợi tín hiệu chuyển đổi tiếp theo.
Tín hiệu rx_done_tick sẽ báo cho khối mã hóa biết khi nào thì bộ nhận đã nhận 
xong numdbit dữ liệu. Khi đó khối mã hóa sẽ lấy dữ liệu từ thanh ghi đệm của bộ 
UART nhận, sau khi lấy xong, khối mã hóa sẽ  thiết lập tín hiệu rd_uart để xóa tín 
hiệu rx_done_tick của bộ UART nhận để bộ  nhận báo cho khối mã hóa nếu nhận 
được các bít dữ liệu tiếp theo.
Clock hệ thống là 50MHz, do đó để có tần số lấy mẫu bằng 16 lần tốc độ baud 

(16*19200 = 307200) ta tạo một bộ chia tần sử dụng bộ đếm mod­163. Để tránh lỗi  
ghi đè dữ  liệu (dữ  liệu cũ chưa xử  lý xong nhưng bị  ghi đè bởi dữ  liệu mới) ta sử 
dụng một bộ đệm để lưu dữ liệu gửi tới vào, bộ đếm có thể là một thanh ghi dịch  
hoặc một stack hoạt động theo cơ chế FIFO. Thiết kế này có quá trình xử lý dữ liệu 
tương đối nhanh (dữ  liệu đưa vào bộ  mã hóa theo tín hiệu đồng bộ  là clock hệ 
thống còn dữ  liệu được nhận trên kênh theo tốc độ  lấy mẫu) nên ta sử  dụng một  
thanh ghi dịch đơn giản để đệm dữ liệu.
Chương trình VHDL mô tả bộ nhận có 4 process chính:
Chiatan : process(clk,rst); ­­ có nhiệm vụ  chia clock hệ  thống  
để tạo tốc độ lấy mẫu.

23


Capnhat : process (clk,tick); ­­ có nhiệm vụ cập nhật các trạng  
thái mới cho thanh ghi b, n, s.
Uart : process (cst,s_reg,n_reg,b_reg,rx_done_tick,rx); ­­ đây là 
process chính của bộ nhận có nhiệm vụ cập nhật các trạng thái của bộ nhận  
và khôi phục lại các bit nhận được.
Flag : process  (rx_done_tick,rd_uart,rst); ­­  đây là  process  để 
thiết lập các tín hiệu giao tiếp với khối mã hóa: báo cho bộ mã hóa biết khi 
nào nhận được numdbit dữ liệu thông qua tín hiệu rx_done_tick và nhận tín 
hiệu rd_uart từ  khối mã hóa để  xóa tín hiệu rx_done_tick cho lần nhận dữ 
liệu tiếp theo.

2. UART Transmitter.
Bộ UART truyền tương tự như bộ nhận. Nó bao gồm các khối truyền, tạo tốc 
độ  baud và mạch giao diện. UART truyền cũng sử  dụng các hằng số  numdbit và  
numstopbit với chức nằng tương tự như bộ nhận để tiện thay đổi trong tương lai.
Thuật toán bao gồm 4 trạng thái chính là idle, start, data, stop tương  ứng biểu  

diễn giai đoạn truyền các bit start, data, stop. Tín hiệu s_tick là tín hiệu cho phép bộ 
tạo tốc độ baud tạo ra tín hiệu lấy mẫu. Ở đây có hai bộ đếm được biểu diễn bởi 
các thanh ghi s và n. Thanh ghi s duy trì theo dõi số  lần lấy mẫu và đếm đến 15  
trong trạng thái start, tới 15 trong trạng thái data, và tới numstopbit trong trạng thái 
stop. Thanh ghi n duy trì theo dõi số bít dữ liệu đã truyền trong trạng thái data. Các 
bít truyền sẽ được được dịch dần ra ngoài sau 16 lần lấy mẫu. Tín hiệu trạng thái 
tx_done_tick được thêm vào. Nó xác nhận cho một chu kỳ truyền đã hoàn thành. 

Sơ đồ khối của bộ UART truyền:

24


Giải thích các khối:
Khối “baud rate generator” tạo tốc độ  baud để  truyền các bít 
dữ  liệu (19200 baud = 19200 bits/s). Tạo ra một tín hiệu lấy mẫu tần số 
bằng 16 lần tốc độ baud.
Khối “Transmitter” truyền lần lượt các bits  start,  data, stop. 
Sau khi truyền xong 8 bits, tín hiệu   tx_done_tick được thiết lập báo đã 
truyền xong 8 bits, cần truyền 8 bits tiếp theo.
Khối “register” là một bộ  đệm tránh tình trạng ghi đè dữ  liệu 
trong khi chưa xử lý xong 8 bits dữ liệu trước đó.
Sau khi truyền xong tín hiệu tx_empty được thiết lập. Khối  
AES sẽ gửi 8 bits tiếp theo tới bộ đệm và thiết lập tín hiệu wr_uart báo hiệu 
cho bộ truyền thực hiện truyền.

­  Thuật toán thiết kế bộ nhận UART trong FPGA: 
Giải thích thuật toán: Ban đầu bộ UART truyền ở trạng thái nghỉ và liên tục lấy  
mẫu với tốc độ  mẫu là 16 lần tốc độ  baud đồng thời liên tục kiểm tra tín hiệu 
tx_start xem đã được thiết lập chưa,  ở trạng thái nghỉ  bộ  truyền thiết lập tín hiệu 

tx= ‘1’ để truyền lên kênh. Khi khối mã hóa yêu cầu truyền bằng cách thiết lập tín 
hiệu wr_uart thì tín hiệu tx_start được thiết lập. Lúc này bộ  truyền chuyển sang  
trạng thái START, và chuyển tín hiệu tx = ‘0’, nếu tín hiệu cho phép s_tick được 
thiết lập, bộ lấy mẫu sẽ tạo tín hiệu mẫu và bộ  đếm được khởi động để  đếm số 
mẫu đã lấy (s=0), mỗi mẫu được lấy s sẽ  tăng 1 khi s=15, tức nghĩa là số  mẫu đã 
lấy là 16 thì kết thúc bit start (1 bit bằng 16 lần lấy mẫu), bộ truyền chuy ển sang  
trạng thái data, bộ đếm được khởi động lại (s=0, n=0). Bộ truyền tiếp tục lấy mẫu 
và đếm các mẫu đã lấy, nếu s=15 thì dịch một bít dữ liệu từ thanh ghi b ra ngoài và 

25


×