Đồ á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"
Bạn đang xem 20 trang mẫu của tài liệu "Đồ á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"", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- do_an_thiet_ke_he_thong_so_de_tai_xay_dung_bo_ma_hoa_va_giai.docx
Nội dung text: Đồ á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"
- ĐỒ Á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 1. UART Receiver 20 2. UART Transmitter 25 3. AES encoder/decoder 29 III. Kiểm tra kết quả 35 1
- 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ế. 2
- 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 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. 3
- 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. Kiến trúc chung của FPGA 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 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. 4
- 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) 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 5
- 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à đả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. 6
- 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 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. 7
- - 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 - 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. 8
- II. UART. 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. 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: 9
- 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. 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. 10
- 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( 28). 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). 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. 11
- PlainText Key Add Round Key Key Expansion Round Subbytes Nr - 1 Round ShiftRows Key Register MixColumns Round Key AddRoundKey Final Round Subbytes ShiftRows Final Round Key AddRoundKey Cipher 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). 12
- Thao tác SubBytes tác động trên từng byte của trạng thái 19 d4 9 S-box 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. 13
- 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 Thao tác ShiftRows tác động trên từng dòng của trạng thái c) Phép biến đổi MixColumns Thao tác MixColumns tác động lên mỗi cột của trạng thái 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, 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 14
- 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: 02 03 01 01 01 02 03 01 01 01 02 03 03 01 01 01 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. Thao tác AddRoundKey tác động lên mỗi cột của trạng thái 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. 15
- K1,1 K1,2 K1,3 K1,4 K2,1 K2,2 K2,3 K2,4 K3,1 K3,2 K3,3 K3,4 K4,1 K4,2 K4,3 K4,4 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. K2, K2, Rc1, P1, 4 4 i 1 K3, K3, Rc2, P2, S- ⨁ = 4 4 ⨁ i 1 K4, Box K4, Rc3, P3, 4 4 i 1 K1, K1, Rc4, P4, 4 4 i 4 01 02 04 08 10 20 40 80 1b 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Ma trận Rcon ⨁ ⨁ ⨁ K1, K1, K1, K1, P1,1 P1,1 P1,2 P1,3 P1,4 1 2 3 4 K2, K2, K2, K2, P2,1 P2,1 P2,2 P2,3 P2,4 1 2 3 4 K3, K3, K3, K3, P3,1 P3,1 P3,2 P3,3 P3,4 1 2 3 4 K4, K4, K4, K4, P4,4 P4,1 P4,2 P4,3 P4,4 1 2 3 4 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 16
- 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ã. N r - 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. 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. 0푒 0 0 09 09 0푒 0 0 0 09 0푒 0 0 0 09 0푒 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 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 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. 18
- II. Thiết kế phần cứng. Sơ đồ khối: rx tx en rx edsel UART Receiver rst 8 bit datain clk AES encoder/decoder Sơ đồ các chân8 bit dataout vào ra tx en UART Transmitter rst clk edsel Sơ đồ các khối bên trong 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. 19
- 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ã. 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. 20
- rx 8 bits datain en rx_empty rd_uart rst clk Sơ đồ các chân vào ra Giải thích các khối: rx rx b_reg d q 8 bits datain clk rx_done_tick Register rx_empty Receiver Tick set_flag clr_flag baud rate rd_uart generator Flag FF en Sơ đồ các khối bên trong 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 21
- 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. 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”. 22
- Thuật toán thiết kế bộ nhận UART trong FPGA: IDLE F If rx==0 T DATA s = 0 F START If s_tick==1 T F F If s_tick==1 If s == 15 s = s+1 T T F s = s+1 If s == 7 s = 0 b = rx&(b>>1) T F s = 0 If n == numdbit-1 n = 0 T F T T Rx_done_tick=1 If s==numstopbit If s_tick==1 STOP F s = s+1 23
- 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, 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 24
- 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. 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. 25
- Sơ đồ khối của bộ UART truyền: 8 bits dataout tx en tx_empty wr_uar t rst clk Sơ đồ các chân vào ra 8 bits tx tx b_reg q d dataout clk tx_done_tick Register Transmitter Tick clr_flag tx_empty set_flag baud rate tx_start wr_uart generator Flag FF en Sơ đồ các khối bên trong 26
- 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 đó. IDLE F If tx_start==1 T DATA s = 0 F START If s_tick==1 T F If s_tick==1 F s = s+1 If s == 15 T T F s = s+1 If s == 15 s = 0 (b&tx)>>1 T F s = 0 If n == numdbit-1 n = 0 T F T T Rx_done_tick=1 If s==numstopbit If s_tick==1 STOP F s = s+1 27
- 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à n tăng 1, tiếp tục khởi động lại bộ đếm. Khi n= numdbit-1, bộ truyền đã truyền hết các bit dữ liệu, bộ truyền chuyển sang trạng thái stop. Các mẫu tiếp tục được lấy và bộ đếm sẽ đếm số mẫu, nếu số mẫu băng numstopbit-1 thì bộ truyền quay lại trạng thái nghỉ đợi tín hiệu từ khối mã hóa truyền numdbit tiếp theo đồng thời tín hiệu tx_done_tick được thiết lập để xóa tín hiệu tx_start cho lần truyền tiếp theo đồng thời tín hiệu tx_done_tick cũng được đưa tới đầu ra để báo cho khối mã hóa biết khi nào thì sẵn sàng gửi dữ liệu. Tương tự như bộ nhận bộ truyền cũng cần một mạch chia tần để tạo tín hiệu lấy mẫu từ clock hệ thống. 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. 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 (cst1,c_reg,n_reg,b_reg,tx_done_tick,tx_start) đây là process chính của bộ truyền có nhiệm vụ cập nhật các trạng thái của bộ truyền và gửi đi các bit dữ liệu. Flag : process (tx_done_tick,wr_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 có thể gửi được 28
- numdbit dữ liệu thông qua tín hiệu tx_done_tick và nhận tín hiệu wr_uart từ khối mã hóa để xóa tín hiệu tx_start cho lần nhận dữ liệu tiếp theo. 3. AES encoder/decoder. Sơ đồ khối của bộ mã hóa/giải mã AES: edsel 8 bits datain 8 bits dataout tx_empty rx_empty rd_uart rst wr_uart clk Sơ đồ các chân vào ra Datain buf 128 bit datain AES 128 bit dataout Dataout buf Sơ đồ các khối bên trong Giải thích các khối: 29
- Từ các bước thực hiện mã hóa và giải mã ta có thể xậy dựng bộ mã hóa/giải mã AES như một máy trạng thái hữu hạn FSM. Với 7 trạng thái start, init, subbytes, shiftrows, mixclumns, getroundkey, addroundkey. Datain buf : AES chỉ làm việc với các khối dữ liệu (đầu vào và đầu ra) 128 bít và khóa có độ dài 128, 192 hoặc 256 bít. Do đó cần chuyển các bits thành các khối 128 bit trước khi thực hiện mã hóa, khối datain buf thực hiện nhiệm vụ này Dataout buf : tương tự với khối datain buf khối này thực hiện chuyển từng byte của khối 128 bits đã mã hóa ra khối uart transmitter để chuyển tới PC. AES : Khối này thực hiện mã hóa và giải mã theo thuật toán AES. Khối này là một máy trạng thái hữu hạn với các trạng thái tương ứng với các bước thực hiện mã hóa trong thuật toán AES : subbytes, shiftrows, mixcolumns, addroundkey. 30
- Sơ đồ máy trạng thái hữu hạn FSM: Reset Reset Idle Flag=’0’ Idle Flag=’0’ Flag2=’0’ Flag2=’0’ Count=9 Count=0 Flag=’1’ Flag=’1’ Init Init Flag2=’0’ Flag2=’0’ Mix SubBytes Columns Flag2=’0’ Flag2=’0’ ShiftRows ShiftRows Flag2=’0’ Flag2=’0’ Count=0 Count>0 Mix SubBytes Columns Flag2=’0’ Flag2=’0’ Get Get Roundkey Roundkey Flag2=’0’ Flag2=’0’ Count=0 Count>0 Count=0 Count>0 Add Add RoundKey RoundKey If count>0 If count<9 Count ; Flag2=’0’; Count++; Flag2=’0’; Else flag2=’1’; Else flag2=’1’; Quá trình mã hóa Quá trình giải mã Giải thích sơ đồ trạng thái : 31
- Máy trạng thái có 6 trạng thái là: Idle, Init, SubBytes, ShiftRaws, MixColumn, GetRoundKey, AddRoundKey. Idle: Đây là trạng thái nghỉ của bộ mã hóa và giải mã. Ở trạng thái này AES không hoạt động và thiết lập các tham số cần thiết cho quá trình hoạt động tùy thuôc vào quá trình là mã hóa hay giải mã. Khi cờ flag=’1’ thì AES chuyển sang trạng thái Init. Cờ flag được bật sau khi bộ đệm đầu vào đã nhận đủ 128 bit dữ liệu. Init: Đây là trạng thái khởi tạo của quá trình mã hóa. Trạng thái này thực hiện xor từng bit của đầu vào với khóa gốc. SubBytes: Thực hiện bước SubBytes trong thuật toán AES. ShiftRaws: Thực hiện bước ShiftRaws trong thuật toán AES. MixColumns: Thực hiện bước MixColumns trong thuật toán AES. GetRoundKey: Ở trạng thái bày AES thực hiện tạo khóa cho vòng mã hóa tương ứng theo thuật toán tạo khóa. AddRoundKey: Thực hiện bước AddRoundKey trong thuật toán AES. Quá trình mã hóa được thực hiện như sau: Khi bộ UART nhận nhận dữ liệu thông qua cổng COM, sẽ dịch từng bít vào thanh ghi cho đến khi thanh ghi được dịch đầy thì UART nhận sẽ gửi một tín hiệu báo cho khối AES biết đã nhận xong numdbit dữ liệu, khối mã hóa sẽ lấy byte đó và chuyển vào bộ đệm đầu vào. Thực chất bộ đệm đầu vào là một mảng dữ liểu bao gồm 128 bit, khối AES sẽ liên tiếp nhận từng numdbit dữ liệu và đặt vào khối 128 bit dữ liệu này. Sau khi bộ đệm đầy, nó sẽ thiết lập một tín hiệu để bật cờ flag. Ban đầu khối mã hóa AES sẽ ở trạng thái nghỉ trong khi các dữ liệu đầu vào được ghi vào bộ đệm đầu vào, trạng thái này sẽ thiết lập các tham số cần thiết cho quá trình mã hóa hoạc giải mã (khóa ban đầu rkey, khợi tạo biến đếm, ma trận nhân mulm). Sau khi bộ đệm đầy và cờ flag được thiết lập, một thanh ghi dtinbuf 128 bit sẽ lấy dữ liệu từ bộ đệm. Thanh ghi này là thanh ghi chính trong khối mã hóa, nó sẽ thay đổi theo quá trình mã hóa hoặc giải mã. Thanh ghi này biểu diễn cho ma trận dữ liệu đầu vào trong 32
- thuật toán AES với mỗi byte tương ứng với giá trị của hàng và cột tính theo từ trái sang phải từ trên xuống dưới. Sau khi cờ flag được thiết lập khối mã hóa sẽ chuyển sang trạng thái khởi tạo, đây là bước đầu tiên trong quá trình mã hóa, thực hiện xor từng bít với khóa ban đầu. dtinbuf<=dtinbuf ⨁ rkey. Khi có một xung tiếp theo của clock hệ thống, khối mã hóa chuyển sang trạng thái subbytes, trong trạng thái này ta sử dụng từng byte của dtinbuf, tách 4 bit đầu vào 4 bit sau của byte này chuyển sang số nguyên và đối chiếu với biến mảng box được khai báo tương ứng cho box trong thuật toán mã hóa, sau đó thay tương ứng giá trị trong mảng box vào vị trí byte tương ứng. Tại sườn dương của xung clock tiếp theo khối mã hóa chuyển sang trạng thái shifrow, trạng thái này thực hiện đổi chỗ các byte tương ứng với vị trí của chúng trong ma trận biểu diễn trong thuật toán AES. Tiếp theo khối chuyển sang trạng thái Mixcolum, trạng thái này sử dụng một đoạn vhdl để thực hiện thuật toán nhân ma trận trong trường GF(2). Đoạn code này mô phỏng quá trình nhân 2 byte trong trường GF(2). Ta sẽ nhân các byte tương ứng theo quy tắc nhân ma trận sử dụng thuật toán này. Bước tạo khóa và cộng khóa cuối cùng được viết mô tả quá trình tạo khóa và cộng khóa cuối cùng của thuật toán AES. Đối với quá trình tạo khóa, ban đầu ta lấy các byte tương ứng với với cột cuối trong ma trận đầu vào và lưu vào một biến, biến này sẽ đổi chỗ byte và thực hiện các thao tác tương tự như bước subbytes, sau đó xor từng bit với cột đầu tiên của ma trân dữ liệu đầu vào và ma trân Rcon để tạo ra cột đầu tiên của ma trận kết quả. Các cột còn lại sau đó được xor với cột vừa tạo để tạo thành các cột còn lại. Bước cuối cùng ta chỉ việc thực hiên phép xor trong vhdl giữa ma trận nhận được sau bước mixclumn và khóa vừa tạo. Sau khi thực hiện xong bước Addroundkey cuối cùng, biến đếm tăng lên 1 và khối mã hóa sẽ quay về trạng thái khởi tạo để thực hiện vòng mã hóa tiếp theo, vòng mã hóa cuối cùng không co bước mixcolumn. Sau khi thực hiện xong 10 vòng mã hóa, một tín hiệu được tạo ra để xóa cờ flag, và quay về trạng thái nghỉ đợi 128 bit dữ liệu tiếp theo từ bộ đệm, đồng thời tạo ra một tín hiệu để báo cho bộ đệm đầu ra biết đã mã hóa xong cần gửi dữ liệu, bộ đệm đầu ra sẽ 33
- lấy 128 bit từ thanh ghi dtinbuf và đưa vào bộ đệm, sau đó bộ đệm đầu ra sẽ giao tiếp với UART truyền để truyền từng numdbit tới UART truyền, sau đó dịch từng bít một lên kênh nối tiếp. Do quá trình mã hóa và giải mã là gần giống nhau, chỉ khác nhau ở một số công đoạn và thứ tự các trạng thái nên ta sẽ sử dụng các câu lệnh if thay vì tách riêng hai trường hợp. Chương trình VHDL mô tả khối mã hóa/ giải mã AES có 6 process chính: datainputbuffer: process (clk,rst) – có nhiệm vụ đưa từng dtnumbit từ bộ UART nhận vào bộ đệm dữ liệu. giaotiep1:process (flag1_reg,flag2_reg,rst) – có nhiệm vụ giao tiếp giữa bộ đệm giữ liệu đầu vào với bộ mã hóa chính. Capnhat : process (clk,rst) – có nhiệm vụ cập nhật các trạng thái của khối mã hóa. process (cst,flag) – đây là process chính xác định các trạng thái tiếp theo và thực hiện các bước trong thuật toán AES. Giaotiep2:process (flag2_reg,flag3,rst) –có nhiệm vụ giao tiếp giữa bộ đệm dữ liệu đầu ra với bộ mã hóa chính. Dataoutbuffer: process (clk,rst) – có nhiệm vụ đưa từng dtnumbit từ bộ đệm dữ liệu đầu ra tới bộ UART truyền. III. Kiểm tra kết quả (Testbench) 34
- Sau khi viết xong đoạn code mô tả phần cứng, ta thực hiện viết testbench để kiểm tra các kết quả đầu vào và đầu ra. Sơ đồ khối testbench như sau: UART tran tx AES rx UART receiver Testbench Trong testbech ta tạo ra tín hiệu clock một bộ UART nhận và UART truyền, để truyền dữ liệu kiểm thử vào phần cứng mạch mã hóa/giải mã đã thiết kế, đầu ra ta lấy từ UART nhận và so sánh với đầu ra chuẩn để biết mạch phần cứng có ổn hay không. Testbench sử dụng hai khối Uart truyền và nhận để truyền bít dữ liệu vào khối mã hóa. Ta sử dụng hai biến 128 bit để lưu 2 khối 128 bít. Hai khối này đóng vai trò như một khối lưu trữ đầu vào. Ta sử dụng UART truyền trong testbench đọc từng byte dữ liệu và truyền vào khối mã hóa đã tạo. UART nhận trong testbench sẽ nhận dữ liệu đã mã hóa từ khối AES. Từng Byte nhận được được lưu vào khối 128 bit khác. Ta sẽ kiểm tra khối này để xem dữ liệu mã hóa liệu có đúng theo yêu cầu không. Việc kiểm tra sẽ sử dụng các kết quả mã hóa có sẵn trên mạng để xác định xem 128 bit nhận được từ khối mã hóa có chính xác hay không. 2 khối đầu vào sẽ được truyền lần lượt để thay đổi để đưa vào bộ mã hóa. Quá trình mô phỏng đã hoàn tất với tập dữ liệu đầu vào thay đổi cho kết quả chính xác. Ai mua code liên hệ sđt 0964435482. 35