久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
FPGA實現MD5算法 Quartus II 13.0 Verilog HDL 模塊源碼 (最大計算55字節)
[打印本頁]
作者:
npn
時間:
2022-3-9 10:20
標題:
FPGA實現MD5算法 Quartus II 13.0 Verilog HDL 模塊源碼 (最大計算55字節)
main.png
(12.05 KB, 下載次數: 98)
下載附件
2022-3-9 10:19 上傳
module md5_while( //進行一輪MD5計算
input [511:0] dat, //MD5塊數據 512位
input [127:0] in, //MD5輸入
output [127:0] out //MD5輸出
);
function [31:0] ReverseIntBytes; //反轉整數字節序(32位大小端轉換)
input [31:0] in;
begin
ReverseIntBytes[31:24] = in[7:0];
ReverseIntBytes[23:16] = in[15:8];
ReverseIntBytes[15:8] = in[23:16];
ReverseIntBytes[7:0] = in[31:24];
end
endfunction
function [31:0] rol32; //32位循環左移
input [31:0] a; //數字 范圍:0~4294967295
input [4:0] b; //位數 范圍:0~31
begin
rol32 = a << b | a >> 6'd32-b;
end
endfunction
function [31:0] md5_F;
input [31:0] x;
input [31:0] y;
input [31:0] z;
begin
md5_F = (x & y) | ((~x) & z);
end
endfunction
function [31:0] md5_G;
input [31:0] x;
input [31:0] y;
input [31:0] z;
begin
md5_G = (x & z) | (y & (~z));
end
endfunction
function [31:0] md5_H;
input [31:0] x;
input [31:0] y;
input [31:0] z;
begin
md5_H = (x ^ y ^ z);
end
endfunction
function [31:0] md5_I;
input [31:0] x;
input [31:0] y;
input [31:0] z;
begin
md5_I = (y ^ (x | (~z)));
end
endfunction
function [31:0] md5_FF;
input [31:0] a;
input [31:0] b;
input [31:0] c;
input [31:0] d;
input [31:0] Mj;
input [4:0] s;
input [31:0] ti;
begin
md5_FF = b + rol32 (a + md5_F(b,c,d) + Mj + ti, s);
end
endfunction
function [31:0] md5_GG;
input [31:0] a;
input [31:0] b;
input [31:0] c;
input [31:0] d;
input [31:0] Mj;
input [4:0] s;
input [31:0] ti;
begin
md5_GG = b + rol32 (a + md5_G(b,c,d) + Mj + ti, s);
end
endfunction
function [31:0] md5_HH;
input [31:0] a;
input [31:0] b;
input [31:0] c;
input [31:0] d;
input [31:0] Mj;
input [4:0] s;
input [31:0] ti;
begin
md5_HH = b + rol32 (a + md5_H(b,c,d) + Mj + ti, s);
end
endfunction
function [31:0] md5_II;
input [31:0] a;
input [31:0] b;
input [31:0] c;
input [31:0] d;
input [31:0] Mj;
input [4:0] s;
input [31:0] ti;
begin
md5_II = b + rol32 (a + md5_I(b,c,d) + Mj + ti, s);
end
endfunction
assign out = {
ReverseIntBytes(AA),
ReverseIntBytes(BB),
ReverseIntBytes(CC),
ReverseIntBytes(DD)
};
reg [31:0] AA;
reg [31:0] BB;
reg [31:0] CC;
reg [31:0] DD;
reg [31:0] A;
reg [31:0] B;
reg [31:0] C;
reg [31:0] D;
wire [31:0] x [15:0];
generate
genvar y;
for(y = 0;y < 16;y = y + 1) begin:gen
assign x[y] = ReverseIntBytes(dat[32*(16-y)-1:32*(16-y)-32]);
end
endgenerate
always @(*) begin
{AA,BB,CC,DD} = {
ReverseIntBytes(in[127:96]),
ReverseIntBytes(in[95:64]),
ReverseIntBytes(in[63:32]),
ReverseIntBytes(in[31:0])
};
{A,B,C,D} = {AA,BB,CC,DD};
A = md5_FF(A, B, C, D, x[00], 5'd07, 32'hD76AA478);
D = md5_FF(D, A, B, C, x[01], 5'd12, 32'hE8C7B756);
C = md5_FF(C, D, A, B, x[02], 5'd17, 32'h242070DB);
B = md5_FF(B, C, D, A, x[03], 5'd22, 32'hC1BDCEEE);
A = md5_FF(A, B, C, D, x[04], 5'd07, 32'hF57C0FAF);
D = md5_FF(D, A, B, C, x[05], 5'd12, 32'h4787C62A);
C = md5_FF(C, D, A, B, x[06], 5'd17, 32'hA8304613);
B = md5_FF(B, C, D, A, x[07], 5'd22, 32'hFD469501);
A = md5_FF(A, B, C, D, x[08], 5'd07, 32'h698098D8);
D = md5_FF(D, A, B, C, x[09], 5'd12, 32'h8B44F7AF);
C = md5_FF(C, D, A, B, x[10], 5'd17, 32'hFFFF5BB1);
B = md5_FF(B, C, D, A, x[11], 5'd22, 32'h895CD7BE);
A = md5_FF(A, B, C, D, x[12], 5'd07, 32'h6B901122);
D = md5_FF(D, A, B, C, x[13], 5'd12, 32'hFD987193);
C = md5_FF(C, D, A, B, x[14], 5'd17, 32'hA679438E);
B = md5_FF(B, C, D, A, x[15], 5'd22, 32'h49B40821);
A = md5_GG(A, B, C, D, x[01], 5'd05, 32'hF61E2562);
D = md5_GG(D, A, B, C, x[06], 5'd09, 32'hC040B340);
C = md5_GG(C, D, A, B, x[11], 5'd14, 32'h265E5A51);
B = md5_GG(B, C, D, A, x[00], 5'd20, 32'hE9B6C7AA);
A = md5_GG(A, B, C, D, x[05], 5'd05, 32'hD62F105D);
D = md5_GG(D, A, B, C, x[10], 5'd09, 32'h02441453);
C = md5_GG(C, D, A, B, x[15], 5'd14, 32'hD8A1E681);
B = md5_GG(B, C, D, A, x[04], 5'd20, 32'hE7D3FBC8);
A = md5_GG(A, B, C, D, x[09], 5'd05, 32'h21E1CDE6);
D = md5_GG(D, A, B, C, x[14], 5'd09, 32'hC33707D6);
C = md5_GG(C, D, A, B, x[03], 5'd14, 32'hF4D50D87);
B = md5_GG(B, C, D, A, x[08], 5'd20, 32'h455A14ED);
A = md5_GG(A, B, C, D, x[13], 5'd05, 32'hA9E3E905);
D = md5_GG(D, A, B, C, x[02], 5'd09, 32'hFCEFA3F8);
C = md5_GG(C, D, A, B, x[07], 5'd14, 32'h676F02D9);
B = md5_GG(B, C, D, A, x[12], 5'd20, 32'h8D2A4C8A);
A = md5_HH(A, B, C, D, x[05], 5'd04, 32'hFFFA3942);
D = md5_HH(D, A, B, C, x[08], 5'd11, 32'h8771F681);
C = md5_HH(C, D, A, B, x[11], 5'd16, 32'h6D9D6122);
B = md5_HH(B, C, D, A, x[14], 5'd23, 32'hFDE5380C);
A = md5_HH(A, B, C, D, x[01], 5'd04, 32'hA4BEEA44);
D = md5_HH(D, A, B, C, x[04], 5'd11, 32'h4BDECFA9);
C = md5_HH(C, D, A, B, x[07], 5'd16, 32'hF6BB4B60);
B = md5_HH(B, C, D, A, x[10], 5'd23, 32'hBEBFBC70);
A = md5_HH(A, B, C, D, x[13], 5'd04, 32'h289B7EC6);
D = md5_HH(D, A, B, C, x[00], 5'd11, 32'hEAA127FA);
C = md5_HH(C, D, A, B, x[03], 5'd16, 32'hD4EF3085);
B = md5_HH(B, C, D, A, x[06], 5'd23, 32'h04881D05);
A = md5_HH(A, B, C, D, x[09], 5'd04, 32'hD9D4D039);
D = md5_HH(D, A, B, C, x[12], 5'd11, 32'hE6DB99E5);
C = md5_HH(C, D, A, B, x[15], 5'd16, 32'h1FA27CF8);
B = md5_HH(B, C, D, A, x[02], 5'd23, 32'hC4AC5665);
A = md5_II(A, B, C, D, x[00], 5'd06, 32'hF4292244);
D = md5_II(D, A, B, C, x[07], 5'd10, 32'h432AFF97);
C = md5_II(C, D, A, B, x[14], 5'd15, 32'hAB9423A7);
B = md5_II(B, C, D, A, x[05], 5'd21, 32'hFC93A039);
A = md5_II(A, B, C, D, x[12], 5'd06, 32'h655B59C3);
D = md5_II(D, A, B, C, x[03], 5'd10, 32'h8F0CCC92);
C = md5_II(C, D, A, B, x[10], 5'd15, 32'hFFEFF47D);
B = md5_II(B, C, D, A, x[01], 5'd21, 32'h85845DD1);
A = md5_II(A, B, C, D, x[08], 5'd06, 32'h6FA87E4F);
D = md5_II(D, A, B, C, x[15], 5'd10, 32'hFE2CE6E0);
C = md5_II(C, D, A, B, x[06], 5'd15, 32'hA3014314);
B = md5_II(B, C, D, A, x[13], 5'd21, 32'h4E0811A1);
A = md5_II(A, B, C, D, x[04], 5'd06, 32'hF7537E82);
D = md5_II(D, A, B, C, x[11], 5'd10, 32'hBD3AF235);
C = md5_II(C, D, A, B, x[02], 5'd15, 32'h2AD7D2BB);
B = md5_II(B, C, D, A, x[09], 5'd21, 32'hEB86D391);
{AA,BB,CC,DD} = {AA + A,BB + B,CC + C,DD + D};
end
endmodule
module md5( //計算MD5 最大55字節
input [439:0] dat, //MD5明文數據 55*8=440位 (位寬必須一致 數據靠左對齊 末尾填0 否則會出錯)
input [5:0] len, //數據字節數 范圍:0~55
output [127:0] ret, //MD5計算結果 128位
output ok //計算成功置1 失敗清0
);
function [63:0] ReverseLongBytes; //反轉長整數字節序(64位大小端轉換)
input [63:0] in;
begin
ReverseLongBytes[63:56] = in[7:0];
ReverseLongBytes[55:48] = in[15:8];
ReverseLongBytes[47:40] = in[23:16];
ReverseLongBytes[39:32] = in[31:24];
ReverseLongBytes[31:24] = in[39:32];
ReverseLongBytes[23:16] = in[47:40];
ReverseLongBytes[15:8] = in[55:48];
ReverseLongBytes[7:0] = in[63:56];
end
endfunction
reg [511:0] md5_block = 512'b0;
assign ok = (len <= 55);
generate
genvar y;
for(y = 0; y <= 55;y = y + 1) begin:gen2
parameter i = 440 - y * 8 - 1;
parameter j = i < 0 ? 7 : i;
parameter k = 72 + i;
always @(*) begin
if(y < len) begin
md5_block[k:k-7] = dat[j:j-7];
end else if(y == len) begin
md5_block[k:k-7] = 8'h80;
end else begin
md5_block[k:k-7] = 8'h0;
end
end
end
endgenerate
always @(*) begin
md5_block[63:0] = ReverseLongBytes(len << 3);
end
md5_while md5_while(
.dat(md5_block),
.in(128'h0123456789ABCDEFFEDCBA9876543210), //嚴禁修改
.out(ret)
);
endmodule
module main(
input clk, //50Mhz 時鐘輸入 Pin17
output reg led //LED Pin3 (低電平點亮)
);
wire [127:0] ret;
wire ok;
md5 md5(
.dat({"Hello World!0123456789",{33{8'h0}}}),
.len(6'd22), //22字節
.ret(ret),
.ok(ok)
);
always @(posedge clk) begin
if(ret == 128'hEF8D236D359B2B0907ADAA4A26D3AFE6 && ok == 1) begin //計算正確點亮
led <= 0;
end else begin //錯誤熄滅
led <= 1;
end
end
endmodule
復制代碼
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
黄色一节片
|
狠狠综合网
|
中文字幕在线观看第一页
|
91你懂的
|
成人做爰69片免费
|
综合一区二区三区
|
国产精品久久久久久妇女6080
|
日韩精品极品
|
国产日韩亚洲
|
四虎成人网
|
亚洲欧美第一页
|
视频在线观看一区
|
狠狠操天天操
|
久婷婷
|
国产精品一区二区不卡
|
色姑娘综合
|
久久在线
|
黄色福利网站
|
精品一区二区在线视频
|
国产免费黄色片
|
日韩中文字幕
|
免费av片
|
国产精品美女久久久久久久久
|
夜夜嗨av一区二区三区网页
|
国内精品一区二区
|
免费一区
|
九九香蕉视频
|
国产精品成人av
|
天天操夜夜操狠狠操
|
精品欧美一区二区精品久久
|
国产网站免费
|
国产麻豆xxxvideo实拍
|
国产一区中文字幕
|
亚洲一区日韩
|
黄色三级在线
|
校园春色综合网
|
国产精品一区二区三
|
91在线看片
|
亚洲第十页
|
久久久久久久久国产
|
亚洲一区高清
|