# Lab4 Data Encryption Standard 此次 Lab 是要讓同學應用 sequential circuit,來實作加密的演算法。 ==請同學注意撰寫前,先畫出架構圖,了解自己的思路後,再依據架構圖,描述自己所設計的電路。== ## __Introduction__ **資料加密標準( 縮寫:DES )** 是一種對稱密鑰加密塊密碼演算法,1976年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),隨後在國際上廣泛流傳開來。它基於使用56位金鑰的對稱演算法。這個演算法因為包含一些機密設計元素,相對短的金鑰長度以及懷疑內含美國國家安全局(NSA)的後門而在開始時有爭議,DES因此受到了強烈的學院派式的審查,並以此推動了現代的塊密碼及其破密學的發展。 <div style="text-align: right"> 出處 <a href="https://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96">Wiki 資料加密標準</a> </div> ## __Algorithm Description__ ### General structure 演算法的整體架構,有四個相同的處理過程,稱為「回次」,並在頭尾各有一次置換,兩次的置換都以查表法來處理。 ![](https://i.imgur.com/6rs6XMe.png) * plaintext 是由讀取四個字元,四個 ASCII 所組成的,串聯的方式就跟讀進來的順序一下。以第一個 cycle 為例:plaintext = {ROM[0], ROM[1], ROM[2], ROM[3]}; 。另外,當 Data 不足的時候,請同學在最後面補上零,並按照原來的方式來進行加密的行為。 #### Initial permutation table 只要是 permutation table,這樣就是 index 的交換。以 initial permutation table 為例,out = { in[31], in[20]... } ; ![](https://i.imgur.com/z6n47r9.png) ![](http://imgur.com/OrHiehI.png =700x) #### Final permutation table ![](https://i.imgur.com/k54HLjD.png) ![](http://imgur.com/jz31xPs.png =700x) ### Rounds 每一個回次,是經由一個費斯妥函數( F 函數)和一個交換組成的,DES 加密的核心就在於 F 函數的設計。 F 函數中,包含三個步驟: 1. **與金鑰混合**:將資料和 Key Generator 所產生出來的四個子金鑰做混合。 2. **S盒查表**:在混合之後,分別分成 4 個 4-bit 的塊,每個 S 盒都以查表法做非線性的加密(如果沒有 S 盒,密碼會是線性的,很容易被破解)。 3. **置換**:最後,S 盒的 16 個輸出透過固定的置換進行重組。 ![](https://i.imgur.com/TuONCws.png =300x)&ensp;&ensp;![](https://i.imgur.com/EtOiWAR.png =300x) #### S Box table 是比對 input 值,以值對應的方式才做輸出,不是 index 的交換。 ![](https://i.imgur.com/mjnP4en.png) #### F function permutation table ![](https://i.imgur.com/fMqBQQ2.png) ### Key Generation 先將 32-bit 金鑰中的 parity bits 丟棄掉,剩下 28-bit 的金鑰,再分成左邊以及右邊的來做 left circular shift,再透過查表方式分別產生出 K1~K4 四個子金鑰。 * parity bits 的功用是用來確保這組 key,在傳輸的過程中沒有受到汙染,在 key 中的每個 byte 中,做 odd parity check,也就是檢查每個 byte 中,應該要有奇數個 1,所以 parity bits 在加密解密的過程中是沒有被用到的,而在 DES 的演算法中,parity bits 是第 24、16、8、0 個 bit。 * left circular shift 即為 left shift 並將最高位數補到最低位數。(例:4'b1010,經過 left circular shift 變換之後,變成 4'b0101) ![](https://i.imgur.com/d2ShjfR.png) #### Key compression table ![](http://imgur.com/5dEVAh4.png) ## __Interface__ ![](https://i.imgur.com/JESfzQ5.png) ### Input | Name | Width | Description | | --- | --- | --- | | clk | 1-bit | clock signal。| | rst_n | 1-bit | rst negative edge 時觸發,所以當 rst_n == 0 時,系統會進行 reset 動作。| | Start | 1-bit | 代表可以開始運算,所以當 Start == 1 時,系統就可以開始進行運算。| | Data | 8-bit | 從 ROM 中所讀出的資料。| | key | 32-bit | 加密的金鑰( with parity bits )。| ### Output | Name | Width | Description | | --- | --- | --- | | Finish | 1-bit | 代表運算結束,只要將 Finish 線拉起 1,testbench 就會比對 Result 結果是否正確。| | En | 1-bit | 控制 ROM 是否 Enable,需要讀取資料時,應將 En 設為 1,才能進行讀取動作。| | Addr | 10-bit | 代表想要讀取的位址。| | ciphertext | 32-bit | 存放加密完成的運算結果。| #### <font color=red>注意:Module IO port 必須與圖中 IO port 命名一致 !!</font> ## __Top View__ 從下圖中我們可以看到 DES 與 ROM 之間的關係,藉由 DES 給予 En 與 Addr signal,就可從 ROM 中獲取想要的 Data。 DES 與 RAM 之間的關係,在於每次只要 Finish 被 trigger 之後,ciphertext 就會被我們按照順序存入 RAM 中,而 RAM 的 ansAddr 與其相關控制,我們已經在 testbench 中,幫同學寫好了。 ![](https://i.imgur.com/YH0jVaC.png) ## __波形圖__ 此部分將從波形圖說明各訊號關係。 * Start 訊號:代表系統可以開始運作,此訊號只會維持一個 cycle 的時間。 ![](https://i.imgur.com/i00sFQx.png) * Addr 與 Data 訊號:利用 Addr port 傳出想要的位址,這樣在下一個 cycle 就可以拿到想要的 Data 資料。 ![](https://i.imgur.com/kzlc5YV.png) * Finish 訊號:只要一拉起,testbench 就會比對同學的答案,並且將同學的 Ciphertext 存入 RAM。(請同學注意 Finish 拉起只維持一個 cycle 就好,要記得放下 Finish 線,這樣才能進行之後的運算。) ![](https://i.imgur.com/QrhteKQ.png) ## Tool ### Testbench 此次 testbench 將由助教提供,請同學們參照 [Testbench](https://hackmd.io/s/BJHfnf7Kl#lab3-更新部分)。 ### Makefile Makefile 撰寫教學請參考 [Makefile](https://hackmd.io/s/HyL4R4lYe) 下圖為此次 Lab4 makefile 助教版本供同學們參考。 ![](https://i.imgur.com/bOEKCy7.png) ### nWave nWave 撰寫教學請參考 [nWave](https://hackmd.io/s/rJB_1B7tx) ## __Requirements__ <font color=red>請注意!!檔名請依照規定,否則不予計分!!</font> * 使用 Design Vision 產生 Netlist 檔 * 請存成 __DES_syn.v__ * 使用 Design Vision 產生的 gate delay 資訊 * 請存成 __DES.sdf__ * 使用 Design Vision 產生的 area 資訊 * 請存成 __Report_area.txt__ * 使用 Design Vision 產生的 clk 資訊 * 請存成 __Report_clk.txt__ ## __繳交文件__ * header.v * info.dat * ans.dat * DES.v * DES_syn.v * DES.sdf * DES_tb.v * makefile * report_area.txt * report_clk.txt * lab4_student#.pdf 請將所有檔案打包成 <font color=red> 壓縮檔(.zip or .tar)</font>,上傳至iLMS 作業繳交區,格式如下: lab4_student#.zip (Example: lab4_102345678.zip) --- ## <font color=red>__Bonus__</font> 這次的 bonus 是希望同學做 DES 的解密,讓同學讀自己的 RAM.dat,並且要解讀成加密之前的文字。 ### __Interface__ ![](https://i.imgur.com/LfFurLd.png) ### __繳交文件__ * header.v * RAM.dat * Decrypt.v * Decrypt_syn.v * Decrypt.sdf * Decrypt_tb.v * makefile * report_area.txt * report_clk.txt * lab4_student#_Bonus.pdf 請將所有檔案打包成 <font color=red> 壓縮檔(.zip or .tar)</font>,上傳至iLMS 作業繳交區,格式如下: lab4_student#_Bonus.zip (Example: lab4_102345678_Bonus.zip) <font color=red> ilms 繳交時與 lab4 作業放在同層即可!!</font> ## __Deadline__ * <font color=red>5/5 (週五) 上午 11:59 不接受補交!!</font> # [Home Page:hatched_chick: ](https://hackmd.io/s/BkYeCF5Og)