// Copyright (c) The University of Cincinnati. All rights reserved. // UC MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF // THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED // TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // PARTICULAR PURPOSE, OR NON-INFRINGEMENT. UC SHALL NOT BE LIABLE // FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, // RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS // DERIVATIVES. // By using or copying this Software, Licensee agrees to abide by the // intellectual property laws, and all other applicable laws of the // U.S., and the terms of this license. // Author : Antarpreet Singh // #include #include #include using namespace std; void binary(int,vector&,int); int decimal(bool*, int); void DES10(vector *ptext, vector *key, vector *ctext) { int i; int right_index = 6; bool l[4]; for(i=0; i<4; i++) { l[i] = (*ptext).at(right_index+i); } bool t[6]; for(i=0; i<6; i++) { t[i] = (*ptext).at(i)^(*key).at(5-i); } bool temp[4] = {t[5], t[4], t[3], t[2]}; bool temp2[2] = {t[1], t[0]}; int sboxout; switch(decimal(temp,4)) { case 0: switch(decimal(temp2,2)) { case 0: sboxout = 13; break ; case 1: sboxout = 1; break ; case 2: sboxout = 7; break ; case 3: sboxout = 2; break ; } break; case 1: switch(decimal(temp2,2)) { case 0: sboxout = 2; break ; case 1: sboxout = 15; break ; case 2: sboxout = 11; break ; case 3: sboxout = 1; break ; } break; case 2: switch(decimal(temp2,2)) { case 0: sboxout = 8; break ; case 1: sboxout = 13; break ; case 2: sboxout = 4; break ; case 3: sboxout = 14; break ; } break; case 3: switch(decimal(temp2,2)) { case 0: sboxout = 4; break ; case 1: sboxout = 8; break ; case 2: sboxout = 1; break ; case 3: sboxout = 7; break ; } break; case 4: switch(decimal(temp2,2)) { case 0: sboxout = 6; break ; case 1: sboxout = 10; break ; case 2: sboxout = 9; break ; case 3: sboxout = 4; break ; } break; case 5: switch(decimal(temp2,2)) { case 0: sboxout = 15; break ; case 1: sboxout = 3; break ; case 2: sboxout = 12; break ; case 3: sboxout = 10; break ; } break; case 6: switch(decimal(temp2,2)) { case 0: sboxout = 11; break ; case 1: sboxout = 7; break ; case 2: sboxout = 14; break ; case 3: sboxout = 8; break ; } break; case 7: switch(decimal(temp2,2)) { case 0: sboxout = 1; break ; case 1: sboxout = 4; break ; case 2: sboxout = 2; break ; case 3: sboxout = 13; break ; } break; case 8: switch(decimal(temp2,2)) { case 0: sboxout = 10; break ; case 1: sboxout = 12; break ; case 2: sboxout = 0; break ; case 3: sboxout = 15; break ; } break; case 9: switch(decimal(temp2,2)) { case 0: sboxout = 9; break ; case 1: sboxout = 5; break ; case 2: sboxout = 6; break ; case 3: sboxout = 12; break ; } break; case 10: switch(decimal(temp2,2)) { case 0: sboxout = 3; break ; case 1: sboxout = 6; break ; case 2: sboxout = 10; break ; case 3: sboxout = 9; break ; } break; case 11: switch(decimal(temp2,2)) { case 0: sboxout = 14; break ; case 1: sboxout = 11; break ; case 2: sboxout = 13; break ; case 3: sboxout = 0; break ; } break; case 12: switch(decimal(temp2,2)) { case 0: sboxout = 5; break ; case 1: sboxout = 0; break ; case 2: sboxout = 15; break ; case 3: sboxout = 3; break ; } break; case 13: switch(decimal(temp2,2)) { case 0: sboxout = 0; break ; case 1: sboxout = 14; break ; case 2: sboxout = 3; break ; case 3: sboxout = 5; break ; } break; case 14: switch(decimal(temp2,2)) { case 0: sboxout = 12; break ; case 1: sboxout = 9; break ; case 2: sboxout = 5; break ; case 3: sboxout = 6; break ; } break; case 15: switch(decimal(temp2,2)) { case 0: sboxout = 7; break ; case 1: sboxout = 2; break ; case 2: sboxout = 8; break ; case 3: sboxout = 11; break ; } break; } vector sboxout_bool(4,0); binary(sboxout,sboxout_bool,0); for(i=3; i>=0; i--) { (*ctext).push_back(sboxout_bool[i]^l[3-i]); } } /******************************************************************/ int decimal(bool* bin, int no_bits) { int i,dec=0; for(i=0;i &bin, int index) { int remainder; if(number <= 1) { bin[index] =number; } else { remainder = number%2; bin[index] =remainder; binary(number>>1,bin,index+1); } } /******************************************************************/