thenuke321

Untitled

Feb 21st, 2015
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cassert>
  6. #include <iterator>
  7. #include <sstream>
  8.  
  9. using namespace std;
  10.  
  11. unsigned char s[256] =  
  12. {
  13.    0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
  14.    0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
  15.    0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
  16.    0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
  17.    0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
  18.    0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
  19.    0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
  20.    0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
  21.    0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
  22.    0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
  23.    0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
  24.    0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
  25.    0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
  26.    0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
  27.    0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
  28.    0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
  29. };
  30.  
  31. unsigned char inv_s[256] =  
  32. {
  33.    0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
  34.    0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
  35.    0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
  36.    0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
  37.    0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
  38.    0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
  39.    0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
  40.    0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
  41.    0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
  42.    0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
  43.    0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
  44.    0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
  45.    0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
  46.    0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
  47.    0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
  48.    0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
  49. };
  50.  
  51. void printThing(unsigned char** text)
  52. {
  53.     for(int i = 0; i < 4; ++i)
  54.     {
  55.         for(int j = 0; j < 4; ++j)
  56.         {  
  57.             printf("%x  ", text[i][j]);
  58.         }
  59.         std::cout << endl;
  60.     }
  61.    
  62. }
  63.  
  64. unsigned char hexMult(unsigned char hexVal, int quantity)
  65. {
  66.     unsigned char result;
  67.     unsigned char temp;
  68.  
  69.     if(quantity == 2)
  70.     {
  71.         temp = hexVal>>7;
  72.         result = (hexVal<<1) + temp;
  73.         if(hexVal > 127)
  74.         {
  75.             result ^= 0x1A;
  76.         }
  77.         return result;
  78.     }
  79.     else
  80.     {
  81.         temp = hexVal>>7;
  82.         result = (hexVal<<1) + temp;
  83.         if(hexVal > 127)
  84.         {
  85.             result ^= 0x1A;
  86.         }
  87.         result ^= hexVal;
  88.         return result;
  89.     }
  90. }
  91.  
  92. unsigned char* stringToUSChar(string text, int size)
  93. {
  94.     string tempText = "";
  95.     for(int i = 0; i < size - 1; i+=2)
  96.     {
  97.          
  98.         tempText += text[i];
  99.         tempText += text[i+1];
  100.         tempText += " ";
  101.     }
  102.      
  103.     unsigned char* result  = new unsigned char[size/2];
  104.     int i = 0;
  105.     std::istringstream text_2(tempText);
  106.  
  107.     unsigned int c;
  108.  
  109.     while (text_2 >> hex >> c)
  110.     {
  111.         result[i] = (unsigned char )c;
  112.         ++i;
  113.     }
  114.  
  115.     return result;
  116. }
  117.  
  118. unsigned char inv_subByte(unsigned char x)
  119. {
  120.     return inv_s[x];
  121. }
  122.  
  123. unsigned char subByte(unsigned char x)
  124. {
  125.     return s[(int)x];
  126. }
  127.  
  128. unsigned char rcon(unsigned char input)
  129. {
  130.     unsigned char c = 1;
  131.     if(input == 0)
  132.         return 0;
  133.     while(input != 1)
  134.     {
  135.         unsigned char temp = c & 0x80;
  136.         c <<= 1;
  137.         if(temp == 0x80)
  138.         {
  139.             c ^= 0x1b;
  140.         }
  141.  
  142.         input--;
  143.     }
  144.  
  145.     return c;
  146. }
  147.  
  148. void schedule_core(unsigned char *input, unsigned char i)  
  149. {
  150.         char a;
  151.         int temp = input[0];
  152.         for(int i = 0; i < 3; ++i)
  153.         {
  154.             input[i] = input[i + 1];
  155.         }
  156.  
  157.         input[3] = temp;
  158.         for(a = 0; a < 4; a++)  
  159.                 input[a] = subByte(input[a]);
  160.         input[0] ^= rcon(i);
  161. }
  162.  
  163. void expandKey(unsigned char key[], unsigned char* result)
  164. {
  165.     unsigned char t[4];
  166.     int c = 16;
  167.     unsigned char i = 1;
  168.     unsigned char temp = 0;
  169.     int a;
  170.  
  171.     for(int j = 0; j < 16; ++j)
  172.     {
  173.         result[j] = key[j];
  174.     }
  175.    
  176.     while(c < 176)  
  177.     {
  178.         for(a = 0; a < 4; a++)
  179.         {
  180.             t[a] = result[a + c - 4];
  181.         }
  182.         if(c % 16 == 0)  
  183.         {
  184.             schedule_core(t,i);
  185.             i++;
  186.         }
  187.         for(a = 0; a < 4; a++)  
  188.         {
  189.             result[c] = result[c - 16] ^ t[a];
  190.             c++;
  191.         }
  192.        
  193.     }
  194. }
  195.  
  196. void addRoundKey(unsigned char** state,unsigned char* key)
  197. {
  198.     cout << "Key: ";
  199.     for(int j = 0; j < 16; ++j)
  200.         printf("%x,", key[j]);
  201.     cout << endl;
  202.  
  203.     for(int i = 0; i < 4; ++i)
  204.     {
  205.         for(int j = 0; j < 4; ++j)
  206.         {
  207.             state[i][j] = state[i][j] ^ key[i*4 + j];
  208.         }
  209.     }
  210. }
  211.  
  212. void shiftRow(unsigned char* row, int bytes)
  213. {
  214.    
  215.     if(bytes == 1)
  216.     {
  217.         int temp = row[0];
  218.         for(int i = 0; i < 3; ++i)
  219.         {
  220.             row[i] = row[i + 1];
  221.         }
  222.  
  223.         row[3] = temp;
  224.     }
  225.     else if(bytes == 2)
  226.     {
  227.         int temp = row[0];
  228.         int temp2 = row[1];
  229.         for(int i = 0; i < 2; ++i)
  230.         {
  231.             row[i] = row[i + 2];
  232.         }
  233.         row[2] = temp;
  234.         row[3] = temp2;
  235.     }
  236.     else if(bytes == 3)
  237.     {
  238.         int temp = row[3];
  239.         for(int i = 3; i > 0; --i)
  240.         {
  241.             row[i] = row[i - 1];
  242.         }
  243.        
  244.         row[0] = temp;
  245.     }
  246. }
  247.  
  248. void inv_shiftRow(unsigned char* row, int bytes)
  249. {
  250.  
  251.     if(bytes == 1)
  252.     {
  253.         int temp = row[0];
  254.         for(int i = 0; i < 3; ++i)
  255.         {
  256.             row[i] = row[i + 1];
  257.         }
  258.  
  259.         row[3] = temp;
  260.     }
  261.     else if(bytes == 2)
  262.     {
  263.         int temp = row[0];
  264.         int temp2 = row[1];
  265.         for(int i = 0; i < 2; ++i)
  266.         {
  267.             row[i] = row[i + 2];
  268.         }
  269.         row[2] = temp;
  270.         row[3] = temp2;
  271.     }
  272.     else if(bytes == 3)
  273.     {
  274.         int temp = row[3];
  275.         for(int i = 3; i > 0; --i)
  276.         {
  277.             row[i] = row[i - 1];
  278.         }
  279.        
  280.         row[0] = temp;
  281.     }
  282. }
  283.  
  284. void mixColumn(unsigned char* column)
  285. {
  286.     unsigned char a[4] , b[4], h;
  287.  
  288.     for(int i = 0; i < 4; ++i)
  289.     {
  290.         a[i] = column[i];
  291.     }
  292.    
  293.     column[0] = hexMult(a[0], 2) ^ hexMult(a[1], 3) ^ a[2] ^ a[3];
  294.     column[1] = a[0] ^ hexMult(a[1], 2) ^ hexMult(a[2], 3) ^ a[3];
  295.     column[2] = a[0] ^ a[1] ^ hexMult(a[2], 2) ^ hexMult(a[3], 3);
  296.     column[3] = hexMult(a[0], 3) ^ a[1] ^ a[2] ^ hexMult(a[3], 2);
  297.  
  298. }
  299.  
  300. unsigned char gmul(unsigned char a, unsigned char b)
  301. {
  302.     unsigned char p = 0;
  303.     unsigned char hi_bit_set;
  304.     for(int i = 0; i < 8; i++)
  305.     {
  306.         if((b & 1) == 1)
  307.             p ^= a;
  308.         hi_bit_set = (a & 0x80);
  309.         a <<= 1;
  310.         if(hi_bit_set == 0x80)
  311.             a ^= 0x1b;     
  312.         b >>= 1;
  313.     }
  314.     return p;
  315. }
  316.  
  317. void inv_mixColumn(unsigned char *column)
  318. {
  319.     unsigned char a[4];
  320.     for(int i=0;i<4;i++)
  321.     {
  322.         a[i] = column[i];
  323.     }
  324.     column[0] = gmul(a[0],14) ^ gmul(a[3],9) ^ gmul(a[2],13) ^ gmul(a[1],11);
  325.     column[1] = gmul(a[1],14) ^ gmul(a[0],9) ^ gmul(a[3],13) ^ gmul(a[2],11);
  326.     column[2] = gmul(a[2],14) ^ gmul(a[1],9) ^ gmul(a[0],13) ^ gmul(a[3],11);
  327.     column[3] = gmul(a[3],14) ^ gmul(a[2],9) ^ gmul(a[1],13) ^ gmul(a[0],11);
  328. }
  329.  
  330. void encrypt(unsigned char** text, unsigned char* key, int size)
  331. {
  332.     cout <<"----------------------------" << endl;
  333.     unsigned char result[4];
  334.     unsigned char* expandedKey = new unsigned char[176];
  335.     expandKey(key, expandedKey);
  336.     addRoundKey(text, expandedKey);
  337.     for(int f = 1; f < 11; ++f)
  338.     {
  339.         cout<<"ROUND " << f << endl;
  340.  
  341.         printThing(text);
  342.                        
  343.         for(int j = 0; j < size; ++j)
  344.         {
  345.             for(int k = 0; k < size; ++k)
  346.             {
  347.                 text[j][k] = subByte(text[j][k]);
  348.             }
  349.         }
  350.         cout<<"After SubByte" << endl;
  351.         printThing(text);
  352.        
  353.         for(int j = 1; j < 4; j++)
  354.         {
  355.             for(int k = 0; k < 4; k++)
  356.             {
  357.                 result[k] = text[k][j];
  358.             }
  359.             shiftRow(result, j);
  360.  
  361.             text[0][j] = result[0];
  362.             text[1][j] = result[1];
  363.             text[2][j] = result[2];
  364.             text[3][j] = result[3];
  365.         }
  366.  
  367.         cout<<"After ShiftRow" << endl;
  368.         printThing(text);
  369.         if(f != 10)
  370.         {
  371.             for(int j = 0; j < 4; j++)
  372.             {
  373.                 mixColumn(text[j]);
  374.             }
  375.            
  376.             cout<<"After mixColumn" << endl;
  377.             printThing(text);
  378.         }
  379.  
  380.         cout<<"After AddRoundKey" << endl;
  381.         expandedKey += 16;
  382.  
  383.         addRoundKey(text, expandedKey);
  384.         printThing(text);
  385.  
  386.         cout <<"----------------------------" << endl;
  387.         cout << endl;
  388.     }
  389. }
  390.  
  391. void decrypt(unsigned char** text, unsigned char* key, int size)
  392. {
  393.     cout <<"----------------------------" << endl;
  394.     unsigned char result[4];
  395.     unsigned char* expandedKey = new unsigned char[176];
  396.     expandKey(key, expandedKey);
  397.     expandedKey += 160;
  398.     addRoundKey(text, expandedKey);
  399.     for(int f = 1; f < 11; ++f)
  400.     {
  401.         cout<<"ROUND " << f << endl;
  402.         printThing(text);
  403.  
  404.                        
  405.         for(int j = 1; j < 4; j++)
  406.         {
  407.             for(int k = 0; k < 4; k++)
  408.             {
  409.                 result[k] = text[k][j];
  410.             }
  411.             inv_shiftRow(result, 4-j);
  412.  
  413.             text[0][j] = result[0];
  414.             text[1][j] = result[1];
  415.             text[2][j] = result[2];
  416.             text[3][j] = result[3];
  417.         }
  418.  
  419.         cout<<"After ShiftRow" << endl;
  420.         printThing(text);
  421.  
  422.         for(int j = 0; j < size; ++j)
  423.         {
  424.             for(int k = 0; k < size; ++k)
  425.             {
  426.                 text[j][k] = inv_subByte(text[j][k]);
  427.             }
  428.         }
  429.         cout<<"After SubByte" << endl;
  430.         printThing(text);
  431.         cout<<"After AddRoundKey" << endl;
  432.                 expandedKey -= 16;
  433.         addRoundKey(text, expandedKey);
  434.  
  435.         printThing(text);
  436.  
  437.         if(f != 10)
  438.         {
  439.             for(int j = 0; j < 4; j++)
  440.             {
  441.                 inv_mixColumn(text[j]);
  442.             }
  443.            
  444.             cout<<"After mixColumn" << endl;
  445.             printThing(text);
  446.         }
  447.  
  448.         cout <<"----------------------------" << endl;
  449.     }
  450.    
  451. }
  452.  
  453. int main()
  454. {
  455.     char type = 'D';
  456.     string text = "" ;
  457.     int size;
  458.     unsigned char **charText;
  459.     unsigned char *charKey;
  460.     string key = "" ;
  461.     std::cout << "Enter E to encrypt or D to decrypt: ";
  462.     cin >> type;
  463.     getline(cin, key);
  464.     std::cout << "Enter Key" << endl;
  465.     getline(cin, key);
  466.      
  467.     if(type == 'E' || type == 'e')
  468.     {
  469.         std::cout << "Enter plaintext" << endl;
  470.         getline(cin, text);
  471.  
  472.         size = text.length();
  473.         charText = new unsigned char* [size/8];
  474.         for(int i = 0; i < size/8; ++i)
  475.         {
  476.             charText[i] = stringToUSChar(text.substr(i*8, size/4), size/4);
  477.         }
  478.        
  479.         charKey = stringToUSChar(key, size);
  480.  
  481.         encrypt(charText, charKey,4);
  482.         std::cout << "The ciphertext is " << endl;
  483.         printThing(charText);
  484.  
  485.         for(int i = 0; i < 4; ++i)
  486.             delete[] charText[i];
  487.         delete[] charText;
  488.         delete[] charKey;
  489.     }
  490.     else if(type == 'D' || type == 'd')
  491.     {
  492.         std::cout << "Enter ciphertext" << endl;
  493.         getline(cin, text);
  494.         cout <<"----------------------------" << endl;
  495.         size = text.length();
  496.         charText = new unsigned char* [size/8];
  497.         for(int i = 0; i < size/8; ++i)
  498.         {
  499.             charText[i] = stringToUSChar(text.substr(i*8, size/4), size/4);
  500.         }
  501.        
  502.         charKey = stringToUSChar(key, size);
  503.  
  504.         decrypt(charText, charKey,4);
  505.         std::cout << "The plaintext is " << endl;
  506.         printThing(charText);
  507.  
  508.         for(int i = 0; i < 4; ++i)
  509.             delete[] charText[i];
  510.         delete[] charText;
  511.         delete[] charKey;
  512.          
  513.        
  514.     }    
  515.  
  516.     cin >> text;
  517.      
  518. }
Advertisement
Add Comment
Please, Sign In to add comment