What I'm trying to do: Write a C program that opens a file of arbitrary size and reads its contents. After the content has been read, it will encrypt them in AES 256 CBC and save the encrypted text to a file called encrypted text. Once this is saved, it will close both files. Then, the encrypted text from the file that was just saved will open and decrypt the encrypted text and save it in a decrypted file.
My problem: It seems like it never decrypts my ciphertext. I get garbage, I have no idea what I'm doing wrong. Please, help.
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <openssl/evp.h> #include <openssl/aes.h> void encrypt(FILE *ifp, FILE *ofp) { //Get file size fseek(ifp, 0L, SEEK_END); int fsize = ftell(ifp); //set back to normal fseek(ifp, 0L, SEEK_SET); int outLen1 = 0; int outLen2 = 0; unsigned char *indata = malloc(fsize); unsigned char *outdata = malloc(fsize*2); unsigned char ckey[] = "thiskeyisverybad"; unsigned char ivec[] = "dontusethisinput"; //Read File fread(indata,sizeof(char),fsize, ifp);//Read Entire File //Set up encryption EVP_CIPHER_CTX ctx; EVP_EncryptInit(&ctx,EVP_aes_256_cbc(),ckey,ivec); EVP_EncryptUpdate(&ctx,outdata,&outLen1,indata,fsize); EVP_EncryptFinal(&ctx,outdata,&outLen2); fwrite(outdata,sizeof(char),fsize,ofp); } void decrypt(FILE *ifp, FILE *ofp) { //Get file size fseek(ifp, 0L, SEEK_END); int fsize = ftell(ifp); //set back to normal fseek(ifp, 0L, SEEK_SET); int outLen1 = 0; int outLen2 = 0; unsigned char *indata = malloc(fsize); unsigned char *outdata = malloc(fsize*2); unsigned char ckey[] = "thiskeyisverybad"; unsigned char ivec[] = "dontusethisinput"; //Read File fread(indata,sizeof(char),fsize, ifp);//Read Entire File //setup decryption EVP_CIPHER_CTX ctx; EVP_DecryptInit(&ctx,EVP_aes_256_cbc(),ckey,ivec); EVP_DecryptUpdate(&ctx,outdata,&outLen1,indata,fsize); EVP_DecryptFinal(&ctx,outdata,&outLen2); fwrite(outdata,sizeof(char),fsize,ofp); } int main(int argc, char *argv[]) { FILE *fIN, *fOUT; fIN = fopen("plain.txt", "rb");//File to be encrypted; plain text fOUT = fopen("cyphertext.txt", "wb");//File to be written; cipher text encrypt(fIN, fOUT); fclose(fIN); fclose(fOUT); //Decrypt file now fIN = fopen("cyphertext.txt", "rb");//File to be written; cipher text fOUT = fopen("decrypted.txt", "wb");//File to be written; cipher text decrypt(fIN,fOUT); fclose(fIN); fclose(fOUT); return 0; }
Note: there may be some errors. EDIT: It seems I made a mistake with the key and IV, both of which are 128 bits, and I'm trying to use 256 bit CBC. That was my problem, it seems to work as soon as I changed it to
EVP_aes_128_cbc()