AES 加密算法,sv实现


本文摘抄自:https://blog.csdn.net/gulang03/article/details/81175854 

代码是根据参考的博客中的算法自己手撸的。

  1 typedef bit[3:0][7:0] Matrix[4]; 
  2 class aes_encrypt;
  3    bit[15:0][7:0] SBLOCK[16] ='{'{8'h76,
  4    local Matrix key;
  5    local Matrix big_key[11];
  6    function new();
  7      key='{default:0};
  8      big_key='{default:0};
  9    endfunction
 10    extern local function Matrix key_xor(input Matrix tkey,input Matrix data);
 11    extern local function Matrix byte_transfer(input Matrix data);
 12    extern local function Matrix row_shift(input Matrix data);
 13    extern local function Matrix col_mix(Matrix data);
 14    extern local function bit[7:0] field_multi(input bit[7:0] val,input bit[7:0] m);
 15    extern local function bit[7:0] field_multi2(input bit[7:0] val);
 16    extern local function void extend_key();
 17    extern local function bit[3:0][7:0] T(input bit[3:0][7:0] W, input bit[7:0] t);
 18    extern local function Matrix get_ciphertext(input Matrix text);
 19    //extern function bit[127:0] get_ciphertext_array(input bit[127:0] text);
 20    extern function void get_key(bit[127:0] val);
 21    //extern function void print(Matrix val,string str);
 22 endclass
 23 function Matrix aes_encrypt::byte_transfer(input Matrix data);
 24   Matrix ret;
 25   for(int i=0; i<4;i++) begin
 26     for(int j=0;j<4;j++) begin
 27       ret[i][j]=SBLOCK[data[i][j][7:4]][data[i][j][3:0]];
 28     end
 29   end
 30   return ret;
 31 endfunction
 32 
 33 function Matrix aes_encrypt::row_shift(input Matrix data);
 34   Matrix ret;
 35   ret[0]=data[0];
 36   ret[1]={data[1][0],data[1][3],data[1][2],data[1][1]};
 37   ret[2]={data[2][1],data[2][0],data[2][3],data[2][2]};
 38   ret[3]={data[3][2],data[3][1],data[3][0],data[3][3]};
 39   return ret;
 40 endfunction
 41 function Matrix aes_encrypt::col_mix(Matrix data);
 42   Matrix ret;
 43   Matrix const_array='{'{8'h01,8'h01,8'h03,8'h02},
 44                '{8'h01,8'h03,8'h02,8'h01},
 45                '{8'h03,8'h02,8'h01,8'h01),
 46                '{8'h02,8'h01,8'h01,8'h03}};
 47   for(int i=0;i<4;i++)begin
 48     for(int j=0;j<4;j++) begin
 49       for(int m=0;m<4;m++) begin
 50         ret[i][j]=ret[i][j]^field_multi(data[m][j],const_array[i][m]);
 51       end
 52     end
 53   end
 54   return ret;
 55 enfunction
 56 
 57 function bit[7:0] aes_encrypt::field_multi(input bit[7:0] val, input bit[7:0] m);
 58   bit[7:0] result=8'h0;
 59   result=m[0]?val:8'd0;
 60   for(int i=1;i<8;i++) begin
 61     if(m[i]==1) begin
 62       for(int t=0;tbegin
 63         result=result^field_multi2(val);
 64       end
 65     end
 66   end
 67   return result;
 68 endfunction
 69 
 70 function bit[7:0] aes_encrypt::field_multi2(input bit[7:0] val);
 71   return (val[7]!=1)?(val<<1):((val<<1)^8'h1b);
 72 endfunction
 73 
 74 function aes_encrypt::extend_key();
 75   bit[3:0][7:0] ww;
 76   big_key[0]=key;
 77   for(int m=1;m<11;m++) begin
 78     for(int j=0;j<4;j++) begin
 79       for(int i=0;i<4;i++) begin
 80         if(j==0) begin
 81           ww={big_key[m-1][0][3],big_key[m-1][1][3],big_key[m-1][2][3],big_key[m-1][3][3]};
 82           ww=T(ww,m);
 83           big_key[m][i][j]=big_key[m-1][i][j]^ww[3-i];
 84         end else begin
 85           big_key[m][i][j]=big_key[m-1][i][j]^big_key[m][i][j-1];
 86         end
 87       end
 88     end
 89   end
 90 endfunction
 91 function bit[3:0][7:0] aes_encrypt::T(input bit[3:0][7:0] W, input bit[7:0] t);
 92   bit[3:0][7:0] ret;
 93   ret={W[2],W[1],W[0],W[3]};
 94   for(int i=0;i<4;i++) begin
 95     ret[i]=SBLOCK[ret[i][7:4]][ret[i][3:0]];
 96   end
 97   case(t)
 98     8'd1: ret=ret^32'h01000000;
 99     8'd2: ret=ret^32'h02000000;
100     8'd3: ret=ret^32'h04000000;
101     8'd4: ret=ret^32'h08000000;
102     8'd5: ret=ret^32'h10000000;
103     8'd6: ret=ret^32'h20000000;
104     8'd7: ret=ret^32'h40000000;
105     8'd8: ret=ret^32'h80000000;
106     8'd9: ret=ret^32'h1b000000;
107     8'd10: ret=ret^32'h36000000;
108   endcase
109   return ret;
110 endfunction
111 function Matrix aes_encrypt::get_ciphertext(input Matrix text);
112   Matrix ret;
113   extend_key();
114   ret=key_xor(key,text);
115   for(int i=1;i<11;i++) begin
116     ret=byte_transfer(ret);
117     ret=row_shift(ret);
118     if(i!=10)begin
119       ret=col_mix(ret);
120     end
121     ret=key_xor(big_key[i],ret);
122   end
123   return ret;
124 endfunction
125 function aes_encrypt:;get_key(bit[127:0] val)
126   //这个只能根据需要自己写了
127 endfunction