Example #1
0
File: AES.cpp Project: ebakan/AES
//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;
}
Example #2
0
File: AES.cpp Project: ebakan/AES
//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);
    }
}
Example #3
0
File: AES.cpp Project: ebakan/AES
//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);
    }
    
}
Example #4
0
File: AES.cpp Project: ebakan/AES
//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
    }
}
Example #5
0
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;
}