Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Nastasie Ion Octavian
- http://tavi-tech.blogspot.com/2012/04/linux-aes-encryption-c.html
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <openssl/evp.h>
- #include <openssl/aes.h>
- #define FILE_BUFFER AES_BLOCK_SIZE*1024
- unsigned char* encrypt_data(unsigned char* data, int *data_len, unsigned char* key, unsigned char* iv)
- {
- EVP_CIPHER_CTX enc_cipher;
- unsigned char *enc_data;
- int enc_len = 0, final_len = 0;
- EVP_CIPHER_CTX_init(&enc_cipher);
- EVP_EncryptInit_ex(&enc_cipher, EVP_aes_256_cbc(), NULL, key, iv);
- enc_data = (unsigned char*)malloc(*data_len + AES_BLOCK_SIZE - *data_len % AES_BLOCK_SIZE);
- if(!enc_data)
- return NULL;
- EVP_EncryptUpdate(&enc_cipher, enc_data, &enc_len, data, *data_len);
- EVP_EncryptFinal_ex(&enc_cipher, enc_data + enc_len, &final_len);
- *data_len = enc_len + final_len;
- EVP_CIPHER_CTX_cleanup(&enc_cipher);
- return enc_data;
- }
- unsigned char* decrypt_data(unsigned char* data, int *data_len, unsigned char* key, unsigned char* iv)
- {
- EVP_CIPHER_CTX dec_cipher;
- unsigned char *dec_data;
- int dec_len = 0, fin_len = 0;
- EVP_CIPHER_CTX_init(&dec_cipher);
- EVP_DecryptInit_ex(&dec_cipher, EVP_aes_256_cbc(), NULL, key, iv);
- dec_data = (unsigned char *)malloc(*data_len);
- if(!dec_data)
- return NULL;
- EVP_DecryptUpdate(&dec_cipher, dec_data, &dec_len, data, *data_len);
- EVP_DecryptFinal(&dec_cipher, dec_data + dec_len, &fin_len);
- *data_len = dec_len + fin_len;
- EVP_CIPHER_CTX_cleanup(&dec_cipher);
- return dec_data;
- }
- int encrypt_file(char* file_in, char* file_out, unsigned char* key, unsigned char* iv)
- {
- FILE *fin, *fout;
- EVP_CIPHER_CTX enc_cipher;
- unsigned char buffer[FILE_BUFFER];
- unsigned char aux[FILE_BUFFER];
- int read_len, write_len = 0;
- fin = fopen(file_in,"rb");
- if(!fin)
- return -1;
- fout = fopen(file_out, "wb");
- if(!fout)
- return -2;
- EVP_CIPHER_CTX_init(&enc_cipher);
- EVP_EncryptInit_ex(&enc_cipher, EVP_aes_256_cbc(), NULL, key, iv);
- while((read_len = fread(buffer,1,FILE_BUFFER,fin)) == FILE_BUFFER)
- {
- EVP_EncryptUpdate(&enc_cipher, aux, &write_len, buffer, read_len);
- fwrite(aux,1,write_len, fout);
- }
- EVP_EncryptUpdate(&enc_cipher, aux, &write_len, buffer, read_len);
- read_len = write_len;
- EVP_EncryptFinal_ex(&enc_cipher, aux + write_len, &write_len);
- fwrite(aux,1,read_len + write_len, fout);
- fclose(fin);
- fclose(fout);
- EVP_CIPHER_CTX_cleanup(&enc_cipher);
- return 0;
- }
- int decrypt_file(char* file_in, char* file_out, unsigned char* key, unsigned char* iv)
- {
- FILE *fin, *fout;
- EVP_CIPHER_CTX dec_cipher;
- unsigned char buffer[FILE_BUFFER];
- unsigned char aux[FILE_BUFFER];
- int read_len, write_len = 0;
- fin = fopen(file_in,"rb");
- if(!fin)
- return -1;
- fout = fopen(file_out, "wb");
- if(!fout)
- return -2;
- EVP_CIPHER_CTX_init(&dec_cipher);
- EVP_DecryptInit_ex(&dec_cipher, EVP_aes_256_cbc(), NULL, key, iv);
- while((read_len = fread(buffer,1,FILE_BUFFER,fin)) == FILE_BUFFER)
- {
- EVP_DecryptUpdate(&dec_cipher, aux, &write_len, buffer, read_len);
- fwrite(aux,1,write_len, fout);
- }
- EVP_DecryptUpdate(&dec_cipher, aux, &write_len, buffer, read_len);
- read_len = write_len;
- EVP_DecryptFinal_ex(&dec_cipher, aux + read_len, &write_len);
- fwrite(aux,1, read_len + write_len, fout);
- fclose(fin);
- fclose(fout);
- EVP_CIPHER_CTX_cleanup(&dec_cipher);
- return 0;
- }
- void cbuff()
- {
- int ch;
- while( (ch =(int)getchar()) != EOF && (char)ch != '\n');
- }
- int main()
- {
- unsigned char key[] = "012345678901234a";
- unsigned char iv[] = "012435678901234d";
- char inp[30], enc[30], dec[30];
- int lene;
- printf("input: ");
- scanf("%s",inp);
- cbuff();
- printf("enc: ");
- scanf("%s",enc);
- cbuff();
- printf("dec: ");
- scanf("%s",dec);
- cbuff();
- encrypt_file(inp, enc, key, iv);
- decrypt_file(enc, dec, key, iv);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement