Đang tải... (xem toàn văn)
Để 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.
ĐỒ Á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 TỐ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 Tn 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Ở I. Tổng quan về PLD và FPGA 1. Giới thiệu về cấu kiện logic khả trình (PLD) 2. FPGA 3. Các bước thiết kế cho FPGA 4. Giới thiệu chung về FPGA của Xilinx 5. Tìm hiểu về phần mềm ISE của Xilinx II. UART 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 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 tố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 q trình tiêu chuẩn hóa kéo dài 5 năm . Vậy nên thuật tốn AES là một thuật tốn có thể áp dụng cho nhiều mục đích . Để nghiên cứu thuật tố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 tố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 tố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ế PHẦN I: LÝ THUYẾT CƠ SỞ I Tổng quan về PLD và FPGA 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ề ngun 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 FlipFlop, có thể thực hiện nhiều hàm Boole khác nhau FPGA Năm 1985, cơng ty Xilinx đưa ra ý tưởng hồn tồn mới, đó là kết hợp thờ gian hồ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 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. 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ơ đồ ngun 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 u cầu. Từ sơ đồ ngun 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ả tồ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 hồ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 file ràng buộc “constrains file” (mơ tả các ngun 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ế đả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 ngun cụ thể trong FPGA. Nếu thiết kế q lớn so với thiết bị được chọn, quy trình này khơng thể hồn thành nhiệm vụ của mình. Q 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 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 ngun 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à q 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à q 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 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) Spartan3 Dòng FPGA Spartan3 đượ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 Spartan3 được tăng thêm về tài ngun 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 Spartan3 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 ở 3trạng thái Các khối RAM ở dạng 18kbit Ngồi ra Spartan3 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 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ử hồ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 MixColumns đã tạo ra tính chất khuyếch tán cho thuật tố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 q trình tạo khóa con Rijndael; mỗi khóa con có độ dài giống như các khối. Q 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 tốn sinh khóa (KeyExpansion) Là q 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 Q 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 Sbox 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 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 chu kỳ giải mã cuối 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 invSbox là ma trận nghịch với Sbox 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 TỐN AES TRÊN NỀN TẢNG CƠNG NGHỆ FPGA I Đặt vấn đề Trong thời đại tồn cầu hóa hiện nay, vấn đề bảo mật an tồn thơng tin internet trở nên hết sức cấp thiết. Có nhiều thuật tốn được đưa ra nhằm bảo đảm an tồn thơng tin trao đổi trên mạng internet. Tuy nhiên theo thời gian các thuật tố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 tố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 tốn AES là rất cần thiết Mạch xây dựng về cơ bản u cầu một khối có nhiệm vụ mã hóa và giải mã dựa trên thuật tố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 hồn thiện sử dụng VHDL và được thực thi trên Spartan3 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 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 tố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 đã hồ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 do đó khơng có tín hiệu clock đồng bộ đi kèm, như vậy q 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, 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 liệu vào ghi dịch bit Sau nhận xong 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 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 tốn thiết kế bộ nhận UART trong FPGA: Giải thích thuật tố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, q 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 q 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à q 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 q 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). Q 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=numdbit1. 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 q 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 mod163. Để 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ó q 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 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 tố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 ngồ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 đã hồ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 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 tốn thiết kế bộ nhận UART trong FPGA: Giải thích thuật tố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 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 ngồi và 25 n tăng 1, tiếp tục khởi động lại bộ đếm. Khi n= numdbit1, 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 numstopbit1 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 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 AES encoder/decoder Sơ đồ khối của bộ mã hóa/giải mã AES: 26 Giải thích các khối: 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 tố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 tốn AES : subbytes, shiftrows, mixcolumns, addroundkey Sơ đồ máy trạng thái hữu hạn FSM: Giải thích sơ đồ trạng thái : 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 q trình hoạt động tùy thc vào q 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 27 Init: Đây là trạng thái khởi tạo của q 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 tốn AES ShiftRaws: Thực hiện bước ShiftRaws trong thuật tốn AES MixColumns: Thực hiện bước MixColumns trong thuật tố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 tốn tạo khóa AddRoundKey: Thực hiện bước AddRoundKey trong thuật tốn AES Q 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 q 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 q trình mã hóa hoặc giải mã. Thanh ghi này biểu diễn cho ma trận liệu đầu vào trong thuật tố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 q trình mã hóa, thực hiện xor từng bít với khóa ban đầu. dtinbuf