hash160 算法 sv实现
class hash160; parameter H0=32'h67452301; parameter H1=32'hefcdab89; parameter H2=32'h98badcfe; parameter H3=32'h10325476; parameter H4=32'hc3d2e1f0; bit[15:0][31:0] db[$];// 代码实现的hash160算法,并没有进行补位处理,使用时该算法的输入需要是补位处理之后的数据。 extern function void extend_block(ref bit[15:0][31:0] src, ref bit[79:0][31:0] dst); extern function bit[31:0] comp_xor(input bit[31:0] a, bit[31:0] b, bit[31:0] c, int t); extern function bit[4:0][31:0] calculate(input bit[79:0][31:0] edb, input bit[4:0][31:0] hh); extern function bit[4:0][31:0] get_hash(); function bit[31:0] k(input int i);
if(i<=19) return 32'h5a827999;
else if(i<=39) return 32'h6ed9eba1;
else if(i<=59) return 32'h8f1bbcdc;
else return 32'hca62c1d6;
endfunction
endclass
function void hash160::extend_block(ref bit[15:0][31:0] src, ref bit[79:0][31:0] dst);
bit[31:0] tmp;
for(int i=0;i<16;i++) dst[i]=src[15-i];
for(int i=16;i<80;i++) begin
tmp=dst[i-3]^dst[i-8]^dst[i-14]^dst[i-16];
dst[i]={tmp[30:0],tmp[31]};
end
endfunction
function bit[31:0] hash160::comp_xor(input bit[31:0] a, bit[31:0] b, bit[31:0] c, int t);
if(t<=19) begin
return (a&b)|((~a)&c);
end else if(t<=39) begin
return a^b^c;
end else if(t<=59) begin
return (a&b)|(a&c)|(b&c);
end else if(t<=79) begin
return a^b^c;
end
endfunction
function bit[4:0][31:0] hash160::calculate(input bit[79:0][31:0] edb, input bit[4:0][31:0] hh);
bit[4:0][31:0] ret;
bit[31:0] t1;
ret={hh[4],hh[3],hh[2],hh[1],hh[0]};
for(int i=0;i<80;i++) begin
t1={ret[0][26:0],ret[0][31:27]}+comp_xor(ret[1],ret[2],ret[3],i)+ret[4]+edb[i]+k(i);
ret[4]=ret[3];
ret[3]=ret[2];
ret[2]={ret[1][1:0],ret[1][31:2]};
ret[1]=ret[0];
ret[0]=t1;
end
ret[0]+=hh[0];
ret[1]+=hh[1];
ret[2]+=hh[2];
ret[3]+=hh[3];
ret[4]+=hh[4];
return ret;
endfunction
function bit[4:0][31:0] hash160::get_hash();
bit[4:0][31:0] result;
bit[79:0][31:0] edb;
bit[15:0][31:0] src;
result={H4,H3,H2,H1,H0};
for(int i=0;i<db.size;i++) begin
src=db[i];
extend_block(src,edb);
result=calculate(edb,result);
end
return result;
endfunction
代码实现的hash160算法,并没有进行补位处理,使用时该算法的输入需要是补位处理之后的数据。
输入:{32'h61626364,8'h80,408'd0,64'd32},对应的hash值:81fe8bfe87576c3ecb22426f8e57847382917acf; 输入按照大端字节序
推荐一个好用的在线加解密网址:https://hash.online-convert.com/sha1-generator