//Decrypts cipher with AES cipher void AES::decrypt(int keySize, uint64_t numBytes, uint8_t*& data, uint8_t* key) { int size=numBytes-16; //don't worry about iv uint8_t* decrypted=new uint8_t[size]; for(int i=0;i<size;i++) //copy over data decrypted[i]=data[i+16]; uint8_t* expandedKey=expandKey(keySize,key); //generate expanded key for(int i=0;i<(int) numBytes/16;i++) { //decrypt each block decryptBlock(keySize,decrypted+i*16,expandedKey); } /* int padding=decrypted[size-1]; //len of padding uint8_t* unpadded=new uint8_t[numBytes-padding]; for(int i=0;i<(int)numBytes-padding;i++) unpadded[i]=decrypted[i]; delete decrypted; data=unpadded;*/ data=decrypted; }
//Encrypts stream with AES cipher void AES::encryptStream (int keySize, uint8_t* iv, std::istream* in, std::ostream* out, uint8_t* key) { uint8_t* expandedKey=expandKey(keySize,key); //generate expanded key uint8_t newiv[16]; //temp iv to encrypt for(int i=0;i<16;i++) newiv[i]=iv[i]; encryptBlock(keySize,newiv,expandedKey); out->write((char*)newiv,16); uint8_t block[16]; uint8_t pnum=1; //padding counter char c; while(!in->eof()) { for(int i=0;i<16;i++) { //read block c=in->get(); //check if next char is eof if(!in->eof()) block[i]=(uint8_t) c; else //pad with chars block[i]=pnum++; } encryptBlock(keySize,block,expandedKey); out->write((char*)block,16); } if(pnum==1) { for(int i=0;i<16;i++) block[i]=(uint8_t)i; encryptBlock(keySize,block,expandedKey); out->write((char*)block,16); } }
//Encrypts plaintext with AES cipher void AES::encrypt(int keySize, uint64_t numBytes, uint8_t* iv, uint8_t*& data, uint8_t* key) { int size=numBytes+16; //input array length + iv length if(numBytes%16!=0) size+=16-numBytes%16; //pads up to block size else size+=16; //else pads another block uint8_t* encrypted=new uint8_t[size]; //output array for(int i=0;i<16;i++) //copy over iv encrypted[i]=iv[i]; uint8_t pnum=1; for(int i=16;i<size;i++) { //copy over array, pad if necessary if(i<(int) numBytes) encrypted[i]=data[i]; else encrypted[i]=pnum++; } data=encrypted; uint8_t* expandedKey=expandKey(keySize,key); //generate expanded key for(int i=0;i<size/16;i++) { //encrypt each block encryptBlock(keySize,data+i*16,expandedKey); } }
//Decrypts stream with AES cipher void AES::decryptStream (int keySize, std::istream* in, std::ostream* out, uint8_t* key) { uint8_t* expandedKey=expandKey(keySize,key); //generate expanded key uint8_t block[16]; in->read((char*)block,16); //skips first 16 bytes of iv while(!in->eof()) { in->read((char*)block,16); decryptBlock(keySize,block,expandedKey); in->get(); //check if next is eof if(!in->eof()) { out->write((char*)block,16); } else { out->write((char*)block,16-block[15]); } in->unget(); //go back } }
int main(int argc, char *argv[]) { //skip argv[0] argc--; argv++; if(argc <= 0) //No arguments provided { fprintf(stderr, "Please enter command line arguments.\n"); printUsage(); return EXIT_FAILURE; } //tablecheck if(strcmp(*argv, "tablecheck") == 0) { if(argc-1 < 1 || argc-1 > 1) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } char* tablefile = malloc(100*sizeof(char)); for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //tablefile if(argv[0][0]=='-' && argv[0][1]=='t' && argv[0][2]=='=') { //Get tablefile from argv int i=0; for(i=3; i<strlen(*argv); i++) { tablefile[i-3] = argv[0][i]; } tablefile[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } checkTable(tablefile); } //modprod else if(strcmp(*argv, "modprod") == 0) { //Get hold of arguments char* poly1 = malloc(100*sizeof(char)); char* poly2 = malloc(100*sizeof(char)); //No, less or extra parameters for modprod if(argc-1 < 2 || argc-1 > 2) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 5) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //poly1 if(argv[0][0]=='-' && argv[0][1]=='p' && argv[0][2]=='1' && argv[0][3]=='=') { //Get poly1 from argv int i=0; for(i=4; i<strlen(*argv); i++) { poly1[i-4] = argv[0][i]; } poly1[i-4] = '\0'; } //poly2 else if(argv[0][0]=='-' && argv[0][1]=='p' && argv[0][2]=='2' && argv[0][3]=='=') { //Get poly2 from argv int i=0; for(i=4; i<strlen(*argv); i++) { poly2[i-4] = argv[0][i]; } poly2[i-4] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } if(strlen(poly1) == 0 || strlen(poly2) == 0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } computeModprod(poly1, poly2); free(poly1); free(poly2); } //keyexpand else if(strcmp(*argv, "keyexpand") == 0) { //Get hold of arguments char* key = malloc(100*sizeof(char)); char* tablefileName = malloc(100*sizeof(char)); //No, less or extra parameters for keyexpand if(argc-1 < 2 || argc-1 > 2) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //key if(argv[0][0]=='-' && argv[0][1]=='k' && argv[0][2]=='=') { //Get key from argv int i=0; for(i=3; i<strlen(*argv); i++) { key[i-3] = argv[0][i]; } key[i-3] = '\0'; } //tablefile else if(argv[0][0]=='-' && argv[0][1]=='t' && argv[0][2]=='=') { //Get tablefile from argv int i=0; for(i=3; i<strlen(*argv); i++) { tablefileName[i-3] = argv[0][i]; } tablefileName[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } if(strlen(key) == 0 || strlen(tablefileName) == 0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } expandKey(key, tablefileName); free(key); free(tablefileName); } //Encrypt - Decrypt else if(strcmp(*argv, "encrypt") == 0 || strcmp(*argv, "decrypt") == 0) { char command[10]=""; if(strcmp(*argv, "encrypt") == 0)strcpy(command, "encrypt"); if(strcmp(*argv, "decrypt") == 0)strcpy(command, "decrypt"); //Get hold of arguments char* key = malloc(100*sizeof(char)); char* tableFileName = malloc(100*sizeof(char)); char* file = malloc(100*sizeof(char)); *file='\0'; //No, less or extra parameters if(argc-1 < 2 || argc-1 > 3) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } for(argc--; argc>0; argc--) { argv++; //Commanldine option encountered if(argv[0][0] == '-') { if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //key if(argv[0][0]=='-' && argv[0][1]=='k' && argv[0][2]=='=') { //Get key from argv int i=0; for(i=3; i<strlen(*argv); i++) { key[i-3] = argv[0][i]; } key[i-3] = '\0'; } else if(argv[0][0]=='-' && argv[0][1]=='t' && argv[0][2]=='=') { //Get tableFileName from argv int i=0; for(i=3; i<strlen(*argv); i++) { tableFileName[i-3] = argv[0][i]; } tableFileName[i-3] = '\0'; } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } } //file else if(strlen(*argv) > 0) { //Get file from argv int i=0; for(i=0; i<strlen(*argv); i++) { file[i] = argv[0][i]; } file[i] = '\0'; } } //Check for errors if(strlen(key)==0 || strlen(tableFileName)==0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } else { if(strcmp(command, "encrypt")==0 || strcmp(command, "decrypt")==0) { //CHECK FORMAT OF KEY /*if(strlen(key)!=16) { fprintf(stderr, "Key should be 8-bytes long, in hexstring format.\n"); printUsage(); return EXIT_FAILURE; } else if(strlen(key)==16) { int k=0; for(k=0; k<16; k++) { if(key[k] < 48 || (key[k] > 57 && key[k] < 97) || key[k] > 102) { fprintf(stderr, "Key is not in hexstring format.\n"); printUsage(); return EXIT_FAILURE; } } }*/ } } if(strlen(key) == 0 || strlen(tableFileName) == 0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } if(strcmp(command, "encrypt") == 0) performEncrypt(key, tableFileName, file); if(strcmp(command, "decrypt") == 0) performDecrypt(key, tableFileName, file); free(key); free(tableFileName); free(file); } //inverse else if(strcmp(*argv, "inverse") == 0) { if(argc-1 < 1 || argc-1 > 1) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } char* poly = malloc(100*sizeof(char)); for(argc--; argc>0; argc--) { argv++; if(strlen(*argv) < 4) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } //poly if(argv[0][0]=='-' && argv[0][1]=='p' && argv[0][2]=='=') { //Get tablefile from argv int i=0; for(i=3; i<strlen(*argv); i++) { poly[i-3] = argv[0][i]; } poly[i-3] = '\0'; } } if(strlen(poly) == 0) { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } computeInverse(poly); } else { fprintf(stderr, "Malformed command.\n"); printUsage(); return EXIT_FAILURE; } return EXIT_SUCCESS; }