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

posted @ 2022-04-06 11:24  学号党  阅读(22)  评论(0编辑  收藏  举报