verilog A5 1流密碼器 課程設計

2021-09-10 15:06:36 字數 4294 閱讀 2162

課程設計內容,用verilog寫乙個a5/1對稱式流密碼器

功能闡述:本次設計的是對稱式流密碼器,若輸入明文則輸出密文,輸入密文則輸出明文,加密和解密的處理過程都一樣。設定處理資料為十六位二進位制數,輸入待處理資料,按下啟動鍵,就能獲得待處理資料

設計思路:使用乙個三段式fsm狀態機來作為控制單元,狀態圖在下方,分為兩個狀態,乙個是初態,乙個是加密態。引進乙個計數器作為輔助,從初態進入加密態,計數器啟動計數,每個時鐘週期生成一位密碼流,加密/解密1位二進位制數,計數1次,計數達到16次結束資料處理回到初態並顯示處理完成的資料,現態轉回初態,計數器歸零。 設計的是經典的三段式狀態機,第一段是輸出邏輯部分,包含兩個always塊,乙個用於金鑰的線性反饋移位和加密資料,由時鐘訊號觸發,另外乙個用於金鑰移位後獲取下一位密碼流,由金鑰的變動觸發;第二段是次態計算部分,每當有變數產生變動時,就根據現態來決定次態,屬於組合邏輯;第三段是次態轉換部分,當時鐘訊號來臨,將次態賦值給現態

核心**:

模組連線和外部介面模組檔案virtual_lab_top.v:

//a5/1密碼器

`default_nettype none

module virtual_lab_top

( input wire clock,

input wire [4:0] button, //按鍵

input wire [35:0] switch, //開關

output wire [35:0] led, //指示燈

output wire [3:0] hex0, //數碼管

output wire [3:0] hex1,

output wire [3:0] hex2,

output wire [3:0] hex3

); //輸入埠賦值給內部訊號

wire [15:0] in = switch[15:0]; //需加/解密的輸入資料

wire start_asyn = button[0]; //啟動訊號

wire _reset = button[1]; //重置訊號

reg start; //啟動訊號定義

wire done; //完成訊號定義

wire [15:0] out; //加/解密完成的輸出資料訊號定義

//啟動訊號

always@(posedge clock or posedge _reset or posedge done)

begin

if(_reset==1 || done==1)

start<=1'b0;

else

start<= start_asyn;

end//連線fsm控制模組

fsm_controller u1(clock,_reset,start,in,out,done);

//內部訊號賦值給輸出埠(數碼管)觀察

assign hex0 = out[3:0];

assign hex1 = out[7:4];

assign hex2 = out[11:8];

assign hex3 = out[15:12];

endmodule

fsm狀態機控制單元模組檔案fsm_controller.v:

//-----------a5/1密碼器-----------

//fsm控制單元

module fsm_controller(

input clock,_reset, start,

input [15:0] in,

output reg [15:0] or,

output reg done

); reg [15:0] ir,out; //輸入,輸出暫存器

reg [63:0] lfsr = 64'h3170604015abcdef; //十六位總金鑰

reg [18:0] x; //分金鑰x

reg [21:0] y; //分金鑰y

reg [22:0] z; //分金鑰z

reg m; //使能總位

reg code; //每次得到的1位密碼流

reg [3:0] count; //4位計數器

//----------計數器-----------

always@(posedge clock or posedge _reset) //為15即已加密16位

begin

if(_reset==1)

count<=0;

else if(current_state==init)

count<=0;

else if(current_state==encrypt)

count<=count+1;

endreg current_state, next_state;

//----------狀態定義----------

localparam init=1'b0; //初始態

localparam encrypt=1'b1; //加密態

/*---------輸出邏輯----------

輸出發生器定義了資料通路,並且通過行為描述來定義了資料通路的控制訊號*/

always@(posedge clock or posedge _reset)

begin

if(_reset==1)

or <= 0;

else

begin

case(current_state)

init:

begin //初始化

if(start==1)

begin

ir <= in;

x <= lfsr[18:0];

y <= lfsr[40:19];

z <= lfsr[63:41];

endend

encrypt:begin

or <= ;

ir <= ;

x <= ;

y <= ;

z <= ;

end

endcase

endendalways@(z)

begin

m = x[8]&y[10]|y[10]&z[10]|x[8]&z[10];

code = ((~m|~x[8])&x[18])^((~m|~y[10])&y[21])^((~m|~z[10])&z[22]);

end//----------狀態轉換----------

always@(*)

begin

case(current_state)

init:

begin

if(start==1)

begin

done=0;

next_state=encrypt;

endelse

begin

done=0;

next_state=init;

endend

encrypt:

begin

if(count<4'hf)

begin

done=0;

next_state=encrypt;

endelse

begin

done=1;

next_state=init;

out=or;

endend

endcase

end//----------狀態轉換----------

always@(posedge clock or posedge _reset)

begin

if(_reset==1)

current_state <= init;

else

current_state <= next_state;

endendmodule

注意:對稱式加密即輸入待加密資料能得到加密好的密文,輸入得到的密文啟動就會解密得到原來的明文,對於時序電路軟體接收資料可能會存在延時,導致顯示結果不是最終處理完的結果,對於輸入的資料可以多按幾次啟動鍵來確保獲得穩定的輸出結果。若不能正常工作,其問題還是出在時鐘週期的設定上,將julabpocket_top.v檔案中呼叫clock_devider的引數ratio調大或調小來選取適當的時鐘週期,從而使得電路能正常工

流密碼檔案加密

檔案加密不同於實時通訊加密在速度上要求不高,所以金鑰陣列可以做得更強大一些,這也就避免了什麼流密碼金鑰混亂程度不夠的偏見,要想資訊保安金鑰陣列要做到唯一性,獨一無二的金鑰陣列只能用一次,這樣就避免了已知明文攻擊的陰影。但是如果使用者使用了相同的密碼,如果生成金鑰的方法固定仍然可以形成相同的金鑰陣列,...

RSA流密碼互補加密

rsa加密具有非對稱性可以完成諸如數字簽名及驗籤之類的事情,這是對稱密碼所不能完成的,但是能加密的內容很少速度較慢,且金鑰冗長不便於使用。而流密碼加密是一種對稱加密簡單並且安全性很高,且速度很快能加密的資訊量很大。如果將兩者結合起來就能做出一種能完成數字認證又能快速加密大量資訊的軟體。實際上只要簡單...

51nod 鎖屏密碼

我們先特判掉n 1的情況,答案很好算,就是2 m 1 用數學歸納法證明。當m 1時,只有一種。當m 1時,設當k對於n 1,可以發現任選三點共線的概率不是很大,答案大概是 n m 的級別,由於答案小於2 63,可知總點數最大在20左右。考慮狀態壓縮動態規劃,我們用f i j s 表示,當前走到了第i...