Advertisement
DBDEBICH

Untitled

Nov 24th, 2023
628
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.14 KB | Source Code | 0 0
  1. #include "tools.h"
  2.  
  3.  
  4. int Table_C[9][4] = {
  5.     {0xAC25, 0x8A93, 0x243D, 0x262E},
  6.     {0xF887, 0xC4F2, 0x8E36, 0x9FA1},
  7.     {0x7DC0, 0x6A29, 0x6D84, 0x34BD},
  8.     {0xA267, 0xCC15, 0x04FE, 0xB94A},
  9.     {0xDF24, 0x40EF, 0x96DA, 0x905F},
  10.     {0xD631, 0xAA62, 0x4D15, 0x70CB},
  11.     {0x7533, 0x45FC, 0x5337, 0xD25E},
  12.     {0xA926, 0x1C7B, 0x5F12, 0x4ECC},
  13.     {0x3C86, 0x28DB, 0xFC01, 0x7CB1}
  14. };
  15.  
  16. int Table_S[9][4] = {
  17.     { 4,  7, 11,  8},
  18.     { 7, 14,  5,  4},
  19.     { 8,  2,  9,  4},
  20.     {13,  1, 14,  6},
  21.     { 7, 12,  5,  1},
  22.     { 2,  4, 12,  3},
  23.     { 9,  2, 11, 13},
  24.     {12,  3,  6, 11},
  25.     { 7, 15,  4, 14}
  26. };
  27.  
  28. char Table_logic[9][4] = {
  29.     {'&','|','&','|',},
  30.     {'|','|','|','|',},
  31.     {'&','|','|','&',},
  32.     {'|','&','|','|',},
  33.     {'|','|','&','&',},
  34.     {'&','&','&','|',},
  35.     {'&','|','|','|',},
  36.     {'&','|','&','&',},
  37.     {'|','|','&','|',}
  38. };
  39.  
  40. std::bitset<16> Tools::r_shift (std::bitset<16> BITS, unsigned int STEP) {
  41.     return (BITS >> STEP) | ((BITS << 16 - STEP));
  42. }
  43.  
  44. bool Tools::fullAdder(bool b1, bool b2, bool& carry)
  45. {
  46.     bool sum = (b1 ^ b2) ^ carry;
  47.     carry = (b1 && b2) || (b1 && carry) || (b2 && carry);
  48.     return sum;
  49. }
  50.  
  51. std::bitset<16> Tools::bitsetAdd(std::bitset<16>& x, std::bitset<16>& y)
  52. {
  53.     bool carry = false;
  54.     std::bitset<16> ans;
  55.     for (int i = 0; i < 16; i++) {
  56.         ans[i] = fullAdder(x[i], y[i], carry);
  57.     }
  58.     return ans;
  59. }
  60.  
  61. std::vector<std::bitset<16> > Tools::keygen(std::bitset<128> key128) {
  62.     std::bitset<16> k0, k1, k2, k3, k4, k5, k6, k7;
  63.     std::vector<std::bitset<16> > result;
  64.     for (int i = 127; i >= 0; i--) {
  65.         if (i > 111) {
  66.             k0 <<= 1;
  67.             k0[0] = key128[i];
  68.         }
  69.         if (i > 95) {
  70.             k1 <<= 1;
  71.             k1[0] = key128[i];
  72.         }
  73.         if (i > 79) {
  74.             k2 <<= 1;
  75.             k2[0] = key128[i];
  76.         }
  77.         if (i > 63) {
  78.             k3 <<= 1;
  79.             k3[0] = key128[i];
  80.         }
  81.         if (i > 47) {
  82.             k4 <<= 1;
  83.             k4[0] = key128[i];
  84.         }
  85.         if (i > 31) {
  86.             k5 <<= 1;
  87.             k5[0] = key128[i];
  88.         }
  89.         if (i > 15) {
  90.             k6 <<= 1;
  91.             k6[0] = key128[i];
  92.         }
  93.         if (i >= 0) {
  94.             k7 <<= 1;
  95.             k7[0] = key128[i];
  96.         }
  97.     }
  98.     result.push_back(k0);
  99.     result.push_back(k1);
  100.     result.push_back(k2);
  101.     result.push_back(k3);
  102.     result.push_back(k4);
  103.     result.push_back(k5);
  104.     result.push_back(k6);
  105.     result.push_back(k7);
  106.  
  107.     return result;
  108. }
  109.  
  110. std::vector<std::bitset<16> > Tools::subbgen(std::bitset<64> N) {
  111.     std::bitset<16> a, b, c, d;
  112.     std::vector<std::bitset<16> > result;
  113.     for (int i = 63; i >= 0; i--) {
  114.         if (i > 47) {
  115.             a <<= 1;
  116.             a[0] = N[i];
  117.         }
  118.         if (i > 31) {
  119.             b <<= 1;
  120.             b[0] = N[i];
  121.         }
  122.         if (i > 15) {
  123.             c <<= 1;
  124.             c[0] = N[i];
  125.         }
  126.         if (i >= 0) {
  127.             d <<= 1;
  128.             d[0] = N[i];
  129.         }
  130.     }
  131.     result.push_back(a);
  132.     result.push_back(b);
  133.     result.push_back(c);
  134.     result.push_back(d);
  135.    
  136.     return result;
  137. }
  138.  
  139. std::vector<std::bitset<8> > Tools::resultcompiler(std::bitset<16> A, std::bitset<16>B, std::bitset<16>C, std::bitset<16>D) {
  140.     std::vector<std::bitset<8> > bit_result;
  141.     std::bitset<8> temp1, temp2;
  142.     for (int j = 0; j < 16; j++) {
  143.         if (j < 8) {
  144.             temp1 << 1;
  145.             temp1[j] = A[j];
  146.         } else {
  147.             temp2 << 1;
  148.             temp2[j-8] = A[j];
  149.         }
  150.     } bit_result.push_back(temp1); bit_result.push_back(temp2);
  151.    
  152.     for (int j = 0; j < 16; j++) {
  153.         if (j < 8) {
  154.             temp1 << 1;
  155.             temp1[j] = B[j];
  156.         } else {
  157.             temp2 << 1;
  158.             temp2[j-8] = B[j];
  159.         }
  160.     } bit_result.push_back(temp1); bit_result.push_back(temp2);
  161.  
  162.     for (int j = 0; j < 16; j++) {
  163.         if (j < 8) {
  164.             temp1 << 1;
  165.             temp1[j] = C[j];
  166.         } else {
  167.             temp2 << 1;
  168.             temp2[j-8] = C[j];
  169.         }
  170.     } bit_result.push_back(temp1); bit_result.push_back(temp2);
  171.  
  172.     for (int j = 0; j < 16; j++) {
  173.         if (j < 8) {
  174.             temp1 << 1;
  175.             temp1[j] = D[j];
  176.         } else {
  177.             temp2 << 1;
  178.             temp2[j-8] = D[j];
  179.         }
  180.     } bit_result.push_back(temp1); bit_result.push_back(temp2);
  181.  
  182.     return bit_result;
  183. }
  184.  
  185. std::vector<std::bitset<16> > Tools::iteration (std::bitset<16> X1, std::bitset<16> X2, std::bitset<16> X3, std::bitset<16> X4, std::bitset<16>key, int round, int iter) {
  186.     std::vector<std::bitset<16> > Y_array;
  187.     std::bitset<16> Y1, Y2, Y3, Y4;
  188.     std::bitset<16> temp1 = X3 ^ key;
  189.     int s = Table_S[round][iter];
  190.     Y3 = r_shift(bitsetAdd(X2, temp1), s);
  191.     std::bitset<16> temp2;
  192.     if (Table_logic[round][iter] == '&') temp2 = Y3 & X4;
  193.     else temp2 = Y3 | X4;
  194.     Y1 = bitsetAdd(X1, temp2);
  195.     Y2 = X2; Y4 = X4;
  196.    
  197.     Y_array.push_back(Y1);
  198.     Y_array.push_back(Y2);
  199.     Y_array.push_back(Y3);
  200.     Y_array.push_back(Y4);
  201.  
  202.     return Y_array;
  203. }
Tags: C++ cpp
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement