You should take a look at the O'Reilly-Book . There are several examples of how to encrypt things. Unfortunately, most of them relate to network encryption.
I found an example in a book, but have not tested it:
#include <openssl/evp.h> int main(int argc, char *argv[]) { EVP_CIPHER_CTX ctx; char key[EVP_MAX_KEY_LENGTH]; char iv[EVP_MAX_IV_LENGTH]; char *ct, *out; char final[EVP_MAX_BLOCK_LENGTH]; char str[] = "123456789abcdef"; int i; if (!seed_prng()) { printf("Fatal Error! Unable to seed the PRNG!\n"); abort(); } select_random_key(key, EVP_MAX_KEY_LENGTH); select_random_iv(iv, EVP_MAX_IV_LENGTH); EVP_EncryptInit(&ctx, EVP_bf_cbc(), key, iv); ct = encrypt_example(&ctx, str, strlen(str), &i); printf("Ciphertext is %d bytes.\n", i); EVP_DecryptInit(&ctx, EVP_bf_cbc(), key, iv); out = decrypt_example(&ctx, ct, 8); printf("Decrypted: >>%s<<\n", out); out = decrypt_example(&ctx, ct + 8, 8); printf("Decrypted: >>%s<<\n", out); if (!EVP_DecryptFinal(&ctx, final, &i)) { printf("Padding incorrect.\n"); abort(); } final[i] = 0; printf("Decrypted: >>%s<<\n", final); } char *encrypt_example(EVP_CIPHER_CTX *ctx, char *data, int inl, int *rb) { char *ret; int i, tmp, ol; ol = 0; ret = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx)); for (i = 0; i < inl / 100; i++) { EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &data[ol], 100); ol += tmp; } if (inl % 100) { EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &data[ol], inl%100); ol += tmp; } EVP_EncryptFinal(ctx, &ret[ol], &tmp); *rb = ol + tmp; return ret; } char *decrypt_example(EVP_CIPHER_CTX *ctx, char *ct, int inl) { /* We're going to null-terminate the plaintext under the assumption it's * non-null terminated ASCII text. The null can be ignored otherwise. */ char *pt = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx) + 1); int ol; EVP_DecryptUpdate(ctx, pt, &ol, ct, inl); if (!ol) /* there no block to decrypt */ { free(pt); return NULL; } pt[ol] = 0; return pt; }
Hope this helps you.