Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.41 KB | None | 0 0
  1. // Example program
  2. #include <iostream>
  3. #include <string>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <bitset>
  7.  
  8. static const int sbox[16][16] =  
  9.  {{0x63 ,0x7c ,0x77 ,0x7b ,0xf2 ,0x6b ,0x6f ,0xc5 ,0x30 ,0x01 ,0x67 ,0x2b ,0xfe ,0xd7 ,0xab ,0x76},
  10.  {0xca ,0x82 ,0xc9 ,0x7d ,0xfa ,0x59 ,0x47 ,0xf0 ,0xad ,0xd4 ,0xa2 ,0xaf ,0x9c ,0xa4 ,0x72 ,0xc0},
  11.  {0xb7 ,0xfd ,0x93 ,0x26 ,0x36 ,0x3f ,0xf7 ,0xcc ,0x34 ,0xa5 ,0xe5 ,0xf1 ,0x71 ,0xd8 ,0x31 ,0x15},
  12.  {0x04 ,0xc7 ,0x23 ,0xc3 ,0x18 ,0x96 ,0x05 ,0x9a ,0x07 ,0x12 ,0x80 ,0xe2 ,0xeb ,0x27 ,0xb2 ,0x75},
  13.  {0x09 ,0x83 ,0x2c ,0x1a ,0x1b ,0x6e ,0x5a ,0xa0 ,0x52 ,0x3b ,0xd6 ,0xb3 ,0x29 ,0xe3 ,0x2f ,0x84},
  14.  {0x53 ,0xd1 ,0x00 ,0xed ,0x20 ,0xfc ,0xb1 ,0x5b ,0x6a ,0xcb ,0xbe ,0x39 ,0x4a ,0x4c ,0x58 ,0xcf},
  15.  {0xd0 ,0xef ,0xaa ,0xfb ,0x43 ,0x4d ,0x33 ,0x85 ,0x45 ,0xf9 ,0x02 ,0x7f ,0x50 ,0x3c ,0x9f ,0xa8},
  16.  {0x51 ,0xa3 ,0x40 ,0x8f ,0x92 ,0x9d ,0x38 ,0xf5 ,0xbc ,0xb6 ,0xda ,0x21 ,0x10 ,0xff ,0xf3 ,0xd2},
  17.  {0xcd ,0x0c ,0x13 ,0xec ,0x5f ,0x97 ,0x44 ,0x17 ,0xc4 ,0xa7 ,0x7e ,0x3d ,0x64 ,0x5d ,0x19 ,0x73},
  18.  {0x60 ,0x81 ,0x4f ,0xdc ,0x22 ,0x2a ,0x90 ,0x88 ,0x46 ,0xee ,0xb8 ,0x14 ,0xde ,0x5e ,0x0b ,0xdb},
  19.  {0xe0 ,0x32 ,0x3a ,0x0a ,0x49 ,0x06 ,0x24 ,0x5c ,0xc2 ,0xd3 ,0xac ,0x62 ,0x91 ,0x95 ,0xe4 ,0x79},
  20.  {0xe7 ,0xc8 ,0x37 ,0x6d ,0x8d ,0xd5 ,0x4e ,0xa9 ,0x6c ,0x56 ,0xf4 ,0xea ,0x65 ,0x7a ,0xae ,0x08},
  21.  {0xba ,0x78 ,0x25 ,0x2e ,0x1c ,0xa6 ,0xb4 ,0xc6 ,0xe8 ,0xdd ,0x74 ,0x1f ,0x4b ,0xbd ,0x8b ,0x8a},
  22.  {0x70 ,0x3e ,0xb5 ,0x66 ,0x48 ,0x03 ,0xf6 ,0x0e ,0x61 ,0x35 ,0x57 ,0xb9 ,0x86 ,0xc1 ,0x1d ,0x9e},
  23.  {0xe1 ,0xf8 ,0x98 ,0x11 ,0x69 ,0xd9 ,0x8e ,0x94 ,0x9b ,0x1e ,0x87 ,0xe9 ,0xce ,0x55 ,0x28 ,0xdf},
  24.  {0x8c ,0xa1 ,0x89 ,0x0d ,0xbf ,0xe6 ,0x42 ,0x68 ,0x41 ,0x99 ,0x2d ,0x0f ,0xb0 ,0x54 ,0xbb ,0x16}};
  25.  
  26. static const unsigned char rcon[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
  27.  
  28. void DrawBits(unsigned char blyat)
  29. {
  30.     std::bitset<8> x(blyat);
  31.     std::cout << x << '\n';
  32. }
  33.  
  34. void DrawMatrix(unsigned char block[4][4])
  35. {
  36.     for(int i = 0; i < 4; i++)
  37.     {
  38.         for(int j = 0; j < 4; j++)
  39.         {
  40.             //std::cout << block[i][j] << " ";
  41.             std::cout << std::hex << (int)block[i][j] << " ";
  42.             //DrawBits(block[i][j]);
  43.             //std::cout << ((block[i][j] >> (4*0)) & 0xff) << " " << ((block[i][j] >> (4*1)) & 0xff);
  44.         }
  45.         std::cout << std::endl;
  46.     }
  47.     std::cout << std::endl;
  48. }
  49.  
  50. void DrawRoundMatrix(unsigned char** block)
  51. {
  52.     for(int i = 0; i < 4; i++)
  53.     {
  54.         for(int j = 0; j < 4; j++)
  55.         {
  56.             std::cout << std::hex << (int)block[i][j] << " ";
  57.         }
  58.         std::cout << std::endl;
  59.     }
  60.     std::cout << std::endl;
  61. }
  62.  
  63. unsigned char bitxor(unsigned char hex1, unsigned char hex2)
  64. {
  65.     //DrawBits(hex1);
  66.     //DrawBits(hex2);
  67.     //std::cout << "----------------" << std::endl;
  68.     //DrawBits(hex1 ^ hex2);
  69.     //std::cout << std::endl;
  70.     return hex1 ^ hex2;
  71. }
  72.  
  73. unsigned char** KeySchedule(unsigned char key[4][4], int roundcount)
  74. {
  75.     unsigned char** newkey = 0;
  76.     newkey = new unsigned char*[4];
  77.     unsigned char rotWord[4];
  78.     rotWord[0] = key[1][3];
  79.     rotWord[1] = key[2][3];
  80.     rotWord[2] = key[3][3];
  81.     rotWord[3] = key[0][3];
  82.    
  83.     for(int j = 0; j < 4; j++)
  84.     {
  85.         std::bitset<8> x(rotWord[j]);
  86.         std::bitset<4> first(0);
  87.         std::bitset<4> second(0);
  88.         for(int i = 0; i < 8; i++)
  89.         {
  90.             if(i < 4)
  91.                 second[i] = x[i];
  92.             else
  93.                 first[i-4] = x[i];
  94.         }
  95.         rotWord[j] = sbox[(int)(first.to_ulong())][(int)(second.to_ulong())];
  96.     }
  97.    
  98.     unsigned char word[4] = { key[0][0], key[1][0], key[2][0], key[3][0]};
  99.     unsigned char rc[4] = { rcon[roundcount], 0, 0, 0};
  100.    
  101.     for(int i = 0; i < 4; i++)
  102.     {
  103.         newkey[i] = new unsigned char[4];
  104.         newkey[i][0] = (word[i] ^ rotWord[i] ^ rc[i]);
  105.     }
  106.    
  107.     word[0] = key[0][1];
  108.     word[1] = key[1][1];
  109.     word[2] = key[2][1];
  110.     word[3] = key[3][1];
  111.     for(int i = 0; i < 4; i++)
  112.     {
  113.         newkey[i][1] = (word[i] ^ newkey[i][0]);
  114.     }
  115.    
  116.     word[0] = key[0][2];
  117.     word[1] = key[1][2];
  118.     word[2] = key[2][2];
  119.     word[3] = key[3][2];
  120.     for(int i = 0; i < 4; i++)
  121.     {
  122.         newkey[i][2] = (word[i] ^ newkey[i][1]);
  123.     }
  124.    
  125.     word[0] = key[0][3];
  126.     word[1] = key[1][3];
  127.     word[2] = key[2][3];
  128.     word[3] = key[3][3];
  129.     for(int i = 0; i < 4; i++)
  130.     {
  131.         newkey[i][3] = (word[i] ^ newkey[i][2]);
  132.     }
  133.    
  134.     return newkey;
  135. }
  136.  
  137. unsigned char** AddRoundKey(unsigned char block1[4][4], unsigned char block2[4][4])
  138. {
  139.     unsigned char** xored = 0;
  140.     xored = new unsigned char*[4];
  141.     for(int i = 0; i < 4; i++)
  142.     {
  143.         xored[i] = new unsigned char[4];
  144.         for(int j = 0; j < 4; j++)
  145.         {
  146.             xored[i][j] = bitxor(block1[i][j], block2[i][j]);
  147.         }
  148.     }
  149.     return xored;
  150. }
  151.  
  152. void SubBytes(unsigned char** block)
  153. {
  154.     for(int i = 0; i < 4; i++)
  155.     {
  156.         for(int j = 0; j < 4; j++)
  157.         {
  158.             std::bitset<8> x(block[i][j]);
  159.             std::bitset<4> first(0);
  160.             std::bitset<4> second(0);
  161.             for(int i = 0; i < 8; i++)
  162.             {
  163.                 if(i < 4)
  164.                     second[i] = x[i];
  165.                 else
  166.                     first[i-4] = x[i];
  167.             }
  168.             block[i][j] = sbox[(int)(first.to_ulong())][(int)(second.to_ulong())];
  169.         }
  170.     }
  171. }
  172.  
  173. void ShiftRows(unsigned char** block)
  174. {
  175.     int row[4];
  176.     for(int i = 0; i < 4; i++)
  177.     {
  178.         row[i] = block[1][i];
  179.     }
  180.     for(int i = 0; i < 3; i++)
  181.     {
  182.         block[1][i] = row[i+1];
  183.     }
  184.     block[1][3] = row[0];
  185.    
  186.     for(int i = 0; i < 4; i++)
  187.     {
  188.         row[i] = block[2][i];
  189.     }
  190.     for(int i = 0; i < 2; i++)
  191.     {
  192.         block[2][i] = row[i+2];
  193.     }
  194.     block[2][2] = row[0];
  195.     block[2][3] = row[1];
  196.    
  197.     for(int i = 0; i < 4; i++)
  198.     {
  199.         row[i] = block[3][i];
  200.     }
  201.     block[3][0] = row[3];
  202.     for(int i = 1; i < 4; i++)
  203.     {
  204.         block[3][i] = row[i-1];
  205.     }
  206. }
  207.  
  208. void gmix_column(unsigned char *r) {
  209.     unsigned char a[4];
  210.     unsigned char b[4];
  211.     unsigned char c;
  212.     unsigned char h;
  213.     /* The array 'a' is simply a copy of the input array 'r'
  214.      * The array 'b' is each element of the array 'a' multiplied by 2
  215.      * in Rijndael's Galois field
  216.      * a[n] ^ b[n] is element n multiplied by 3 in Rijndael's Galois field */
  217.     for (c = 0; c < 4; c++) {
  218.         a[c] = r[c];
  219.         /* h is 0xff if the high bit of r[c] is set, 0 otherwise */
  220.         h = (unsigned char)((signed char)r[c] >> 7); /* arithmetic right shift, thus shifting in either zeros or ones */
  221.         b[c] = r[c] << 1; /* implicitly removes high bit because b[c] is an 8-bit char, so we xor by 0x1b and not 0x11b in the next line */
  222.         b[c] ^= 0x1B & h; /* Rijndael's Galois field */
  223.     }
  224.     r[0] = b[0] ^ a[3] ^ a[2] ^ b[1] ^ a[1]; /* 2 * a0 + a3 + a2 + 3 * a1 */
  225.     r[1] = b[1] ^ a[0] ^ a[3] ^ b[2] ^ a[2]; /* 2 * a1 + a0 + a3 + 3 * a2 */
  226.     r[2] = b[2] ^ a[1] ^ a[0] ^ b[3] ^ a[3]; /* 2 * a2 + a1 + a0 + 3 * a3 */
  227.     r[3] = b[3] ^ a[2] ^ a[1] ^ b[0] ^ a[0]; /* 2 * a3 + a2 + a1 + 3 * a0 */
  228. }
  229.  
  230. void MixColumns(unsigned char** block)
  231. {
  232.     unsigned char column[4];
  233.     for(int j = 0; j < 4; j++)
  234.     {
  235.         for(int i = 0; i < 4; i++)
  236.         {
  237.             column[i] = block[i][j];
  238.         }
  239.         gmix_column(column);
  240.         for(int i = 0; i < 4; i++)
  241.         {
  242.             block[i][j] = column[i];
  243.         }
  244.     }
  245. }
  246.  
  247. std::string AES(int key, std::string text)
  248. {
  249.     unsigned char block[4][4] = {  
  250.        {(unsigned char)50, (unsigned char)136, (unsigned char)49, (unsigned char)224},
  251.        {(unsigned char)67, (unsigned char)90, (unsigned char)49, (unsigned char)55},
  252.        {(unsigned char)246, (unsigned char)48, (unsigned char)152, (unsigned char)7},
  253.        {(unsigned char)168, (unsigned char)141, (unsigned char)162, (unsigned char)52}
  254.     };
  255.    
  256.     unsigned char cipherkey[4][4] = {
  257.        {(unsigned char)43, (unsigned char)40, (unsigned char)171, (unsigned char)9},
  258.        {(unsigned char)126, (unsigned char)174, (unsigned char)247, (unsigned char)207},
  259.        {(unsigned char)21, (unsigned char)210, (unsigned char)21, (unsigned char)79},
  260.        {(unsigned char)22, (unsigned char)166, (unsigned char)136, (unsigned char)60}
  261.     };
  262.    
  263.     //std::cout << "Basic block:" << std::endl;
  264.     //DrawMatrix(block);
  265.    
  266.     std::cout << "Cypher key:" << std::endl;
  267.     DrawMatrix(cipherkey);
  268.    
  269.     unsigned char** addedRoundKey = AddRoundKey(block, cipherkey);
  270.    
  271.     //std::cout << "After addrounds:" << std::endl;
  272.     //DrawRoundMatrix(addedRoundKey);
  273.    
  274.     //std::cout << "After subbytes:" << std::endl;
  275.     SubBytes(addedRoundKey);
  276.     //DrawRoundMatrix(addedRoundKey);
  277.    
  278.     //std::cout << "After shiftrows:" << std::endl;
  279.     ShiftRows(addedRoundKey);
  280.     //DrawRoundMatrix(addedRoundKey);
  281.    
  282.     //std::cout << "After mixcolumns:" << std::endl;
  283.     MixColumns(addedRoundKey);
  284.     //DrawRoundMatrix(addedRoundKey);
  285.    
  286.     unsigned char** newkey = KeySchedule(cipherkey, 0);
  287.     //DrawRoundMatrix(newkey);
  288.    
  289.     unsigned char** newerblock = addedRoundKey(addedRoundKey, newkey);
  290.     DrawRoundMatrix(newerblock);
  291.     //std::cout << (int)(first.to_ulong()) << " " << (int)(second.to_ulong()) << std::endl;
  292.     return "Encrypted data";
  293. }
  294.  
  295. int main()
  296. {
  297.   /*long long alice;// = 4;
  298.   long long bob;// = 3;
  299.   long long prime = 31;
  300.   long long generated = 5; //a primitive root modulo 'prime'
  301.   alice = rand() % prime; //must be lower than generated
  302.   bob = rand() % prime;
  303.   std::cout << "Alice's private key is " << alice << std::endl;
  304.   std::cout << "Bob's private key is " << bob << std::endl;
  305.  
  306.   long long ag = (long long)pow(generated, alice) % prime;
  307.   std::cout << "Alice's ag is " << ag << " and sends it to Bob." << std::endl;
  308.  
  309.   long long bg = (long long)pow(generated, bob) % prime;
  310.   std::cout << "Bob's bg is " << bg << " and sends it to Alice." << std::endl;
  311.  
  312.   int aliceSecretKey = (long long)pow(bg, alice) % prime;
  313.   std::cout << "Alice's computed key is " << aliceSecretKey << std::endl;
  314.  
  315.   int bobSecretKey = (long long)pow(ag, bob) % prime;
  316.   std::cout << "Bob's computed key is " << bobSecretKey << std::endl;
  317.  
  318.   std::cout << "Public values are: P=23, generated value=5, ag=" << ag << " and bg=" << bg << std::endl;
  319.   */
  320.  
  321.   std::cout << AES(25, "text");
  322.   return 0;
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement