/*16 round feistel network with 64 bit block length and 56 bit keylength*/ int des(int key, int message){ //split message into left and right halves //for-loop calling sboxes and keyschedule int left = //LEFT OF THE MESSAGE; int right = //RIGHT OF THE MESSAGE; int round; for(round = 0; round < 16; round++){ int oldleft = left; left = right; right = XOR(oldleft, mangler(keyschedule(key,round),right)); //fix this } return left CONCAT right; //fix this; perform concatenation }
/* * DES decryption of input from FILE pointer `fp' using key `sKey' and * tables specified in file `tablefile'. */ void decrypt(const char* sKey, const char* tablefile, FILE* fp) { uint8_t buf[8]; /* block size is 64 bits */ memset(buf, 0, 8 * sizeof(uint8_t)); int keys[16][48]; /* represent each key bit as an integer */ for (int i = 0; i < 16; ++i) { memset(keys[i], 0, 48 * sizeof(int)); } int** table = tablecheck(tablefile); int* V = table[11]; int* PC1 = table[12]; int* PC2 = table[13]; keyschedule(sKey, V, PC1, PC2, keys); reverse(keys, 16); int m[64]; int res[64]; memset(m, 0, 64 * sizeof(int)); memset(res, 0, 64 * sizeof(int)); while (!feof(fp)) { memset(buf, 0, 8 * sizeof(uint8_t)); int nObj = 0; for (int i =0; i < 8; ++i) { nObj = fread(&buf[i], 1, 1, fp); if (nObj == 0) { if (i == 0) { return; } else { break; } } } unpack(buf, m); des(m, table, keys, res); pack(res, buf); fwrite(buf, 1, 8, stdout); } }
void ubiimplement(void)//function to implement the ubi chaining mode { int originalsize,i1,mini,w,j,tempe[100000],tempe1[128],i,tempe2[127],maxaddvalue,tempe3[128],tweakbyte1[16]; originalsize=sizeofplaintext; while((sizeofplaintext%32)!=0)//making the size of plaintext a multiple of 32 bytes { plaintext[sizeofplaintext]=0; sizeofplaintext=sizeofplaintext+1; } bytestowords(plaintext,0,sizeofplaintext);//converting from bytes to 64 bit words for use in threefish for(i1=1;i1<=(sizeofplaintext/32);i1++)//the rounds in ubi chaining mode { mini=originalsize;//implementing the generation of tweak value for each round if(mini<(i*32)) mini=(i*32); w=0; for(j=mini;j!=0;j=(j/2))//converting to bits { tempe[w]=(j%2); w=w+1; } for(i=0,j=127;i<128;i++,j--)//inverting input tweak { tempe1[i]=tweak[j]; } addbyte(tempe1,tempe,128,w);//performing bit addition if(w>128) maxaddvalue=w; else maxaddvalue=128; if((i1-1)==0) { for(i=0;i<126;i++)//finding 2^126 { tempe2[i]=0; } tempe2[i]=1; addbyte(addvalue,tempe2,maxaddvalue,127);//adding bits if(maxaddvalue<127)//updating max array size maxaddvalue=127; } if(i1==(sizeofplaintext-1)) { for(i=0;i<127;i++)//finding 2^127 { tempe3[i]=0; } tempe3[i]=1; addbyte(addvalue,tempe3,maxaddvalue,128);//adding bits if(maxaddvalue<128)//updating max array size maxaddvalue=128; } changebyte(addvalue,maxaddvalue);//changing to byte format from bits for(i=0,j=15;i<16;i++,j--)//changing to lsb first mode { tweakbyte1[i]=tweakbyte[j]; } bytestowords(blockcipherkey,1,32);//changing from bytes to 64-bit words for threefish bytestowords(tweakbyte1,2,16); keyschedule();//generating key schedule rounds();//performing rounds in threefish for(i=0;i<32;i++)//generating block cipher key for next ubi round { blockcipherkey[i]=ciphertext[i]; if(move1<originalsize) { entireciphertext[move1]=ciphertext[i]; move1=move1+1; } } } }