Advertisement
redsees

Asynchronized S-DES Design

Jan 19th, 2017
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Simplified Data Encryption Standard (S-DES)
  3.     8-bit 2-round block cipher encryption and decryption algorithm using 10-bit key.
  4. */
  5.  
  6.  
  7. module SDES(input en, input[0:9] key, input[0:7] plaintext, input encrypt, output[0:7] ciphertext);
  8.     reg[0:7] tempB, tempD, IP_out, sw_out, iip_out, feistel_out;
  9.    
  10.     assign ciphertext = (en)?(iip_out):(8'b0);
  11.    
  12.     // Generate Key1 and Key2
  13.     task GenerateKeys;
  14.         input[0:9] Key;
  15.         output[0:7] Key1, Key2;
  16.        
  17.         reg[0:9] p10_out, tempA, tempC;
  18.  
  19.         begin
  20.             // P10 Permutations
  21.             p10_out = {Key[2], Key[4], Key[1], Key[6], Key[3], Key[9], Key[0], Key[8], Key[7], Key[5]};
  22.        
  23.             // Left Rotation by 1 bit
  24.             tempA = {p10_out[1:4], p10_out[0], p10_out[6:9], p10_out[5]};
  25.        
  26.             // P8 Permutations
  27.             Key1  = {tempA[5], tempA[2], tempA[6], tempA[3], tempA[7], tempA[4], tempA[9], tempA[8]};
  28.        
  29.             // Left Rotation by 3 bits
  30.             tempC = {p10_out[3:4], p10_out[0:2], p10_out[8:9], p10_out[5:7]};
  31.        
  32.             // P8 Permutations
  33.             Key2 = {tempC[5], tempC[2], tempC[6], tempC[3], tempC[7], tempC[4], tempC[9], tempC[8]};
  34.         end
  35.        
  36.     endtask
  37.    
  38.     // Feistel Function
  39.     task Feistel;
  40.     input[0:7] inp_block, key;
  41.     output[0:7] out_block;
  42.    
  43.     reg[0:3] first_chunk, second_chunk, xor_fout, xor_f1, xor_f2, p4_in, p4_out;
  44.     reg[0:7] EP_out, xor_out;
  45.     reg[0:1] s0_out, s1_out;
  46.    
  47.     begin
  48.         first_chunk  = inp_block[0:3];
  49.         second_chunk = inp_block[4:7];
  50.        
  51.         EP_out = {second_chunk[3], second_chunk[0], second_chunk[1], second_chunk[2], second_chunk[1], second_chunk[2], second_chunk[3], second_chunk[0]};
  52.        
  53.         xor_out = EP_out ^ key;
  54.    
  55.         xor_f1 = xor_out[0:3];
  56.         xor_f2 = xor_out[4:7];
  57.        
  58.         S0_Box(xor_f1, s0_out);
  59.         S1_Box(xor_f2, s1_out);
  60.        
  61.         p4_in = {s0_out, s1_out};
  62.  
  63.         p4_out = {p4_in[1],p4_in[3],p4_in[2],p4_in[0]};
  64.            
  65.         xor_fout = p4_out ^ first_chunk;
  66.        
  67.         out_block = {xor_fout, second_chunk};
  68.     end
  69.    
  70.     endtask
  71.    
  72.     // S0 Box
  73.     task S0_Box;
  74.     input[0:3] inp_bits;
  75.     output[0:1] out_bits;
  76.    
  77.     begin
  78.         case(inp_bits)
  79.             4'b0000: out_bits = 2'b01;
  80.             4'b0001: out_bits = 2'b11;
  81.             4'b0010: out_bits = 2'b00;
  82.             4'b0011: out_bits = 2'b10;
  83.             4'b0100: out_bits = 2'b11;
  84.             4'b0101: out_bits = 2'b01;
  85.             4'b0110: out_bits = 2'b10;
  86.             4'b0111: out_bits = 2'b00;
  87.             4'b1000: out_bits = 2'b00;
  88.             4'b1001: out_bits = 2'b11;
  89.             4'b1010: out_bits = 2'b10;
  90.             4'b1011: out_bits = 2'b01;
  91.             4'b1100: out_bits = 2'b01;
  92.             4'b1101: out_bits = 2'b11;
  93.             4'b1110: out_bits = 2'b11;
  94.             4'b1111: out_bits = 2'b10;
  95.         endcase
  96.     end
  97.    
  98.     endtask
  99.  
  100.     // S1 Box
  101.     task S1_Box;
  102.     input[0:3] inp_bits;
  103.     output[0:1] out_bits;
  104.    
  105.     begin
  106.         case(inp_bits)
  107.             4'b0000: out_bits = 2'b00;
  108.             4'b0001: out_bits = 2'b10;
  109.             4'b0010: out_bits = 2'b01;
  110.             4'b0011: out_bits = 2'b00;
  111.             4'b0100: out_bits = 2'b10;
  112.             4'b0101: out_bits = 2'b01;
  113.             4'b0110: out_bits = 2'b11;
  114.             4'b0111: out_bits = 2'b11;
  115.             4'b1000: out_bits = 2'b11;
  116.             4'b1001: out_bits = 2'b10;
  117.             4'b1010: out_bits = 2'b00;
  118.             4'b1011: out_bits = 2'b01;
  119.             4'b1100: out_bits = 2'b01;
  120.             4'b1101: out_bits = 2'b00;
  121.             4'b1110: out_bits = 2'b00;
  122.             4'b1111: out_bits = 2'b11;
  123.         endcase
  124.     end
  125.    
  126.     endtask
  127.    
  128.     //always@(plaintext or key or encrypt)
  129.     always@(en)
  130.     begin
  131.         if(en)
  132.         begin
  133.        
  134.         // Generate Key1 and Key2
  135.         GenerateKeys(key, tempB, tempD);
  136.                    
  137.         // Initial Permutation
  138.         IP_out = {plaintext[1], plaintext[5], plaintext[2], plaintext[0], plaintext[3], plaintext[7], plaintext[4], plaintext[6]};
  139.        
  140.         // First Round
  141.         if(encrypt)
  142.             Feistel(IP_out, tempB, feistel_out);
  143.         else
  144.             Feistel(IP_out, tempD, feistel_out);
  145.        
  146.         // Swapping
  147.         sw_out = {feistel_out[4:7], feistel_out[0:3]};
  148.        
  149.         // Second Round
  150.         if(encrypt)
  151.             Feistel(sw_out, tempD, feistel_out);
  152.         else
  153.             Feistel(sw_out, tempB, feistel_out);
  154.        
  155.         // Inverse Initial Permutation
  156.         iip_out = {feistel_out[3], feistel_out[0], feistel_out[2], feistel_out[4], feistel_out[6], feistel_out[1], feistel_out[7], feistel_out[5]};
  157.         end
  158.     end
  159.    
  160. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement