Hi, I'm trying to use AES-CFB1 through the "low-level" calls. Here's the example program I have come up with:
#include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <openssl/bio.h> #define KEY_SIZE 16 int main(void) { int i; AES_KEY key; BIO* bio_out; unsigned char key_data[KEY_SIZE] = { 0xfe, 0xec, 0x82, 0x17, 0xb5, 0x1, 0x98, 0x6b, 0x5e, 0xf1, 0xb8, 0x6, 0x52, 0x74, 0x2e, 0x52 }; unsigned char iv[AES_BLOCK_SIZE]; unsigned char const iv_data[AES_BLOCK_SIZE] = { 0x10, 0x8a, 0xc9, 0x30, 0xb7, 0xf2, 0x35, 0x21, 0xfb, 0xac, 0x6b, 0xdf, 0x80, 0x95, 0xeb, 0x1e }; char* data = "Internet is a wonderful mechanism for making a fool " "of yourself in front of a very large audience"; int length = (int) strlen(data); int num = 0; /* Allocate some space for the ciphertext and plaintext */ char* ciphertext = (char*) malloc(sizeof(char) * length); char* plaintext = (char*) malloc(sizeof(char) * length); /* Copy the IV data to the IV array */ memcpy(iv, iv_data, AES_BLOCK_SIZE); /* Set the encrypt key structure using the predefined key */ AES_set_encrypt_key(key_data, KEY_SIZE * 8, &key); /* Carry out the encryption */ AES_cfb1_encrypt(data, ciphertext, length, &key, iv, &num, AES_ENCRYPT); /* Setup output */ bio_out = BIO_new_fp(stdout, BIO_NOCLOSE); BIO_printf(bio_out, "Original plaintext: %s\n\n", data); BIO_printf(bio_out, "Ciphertext: "); /* Print out the ciphertext */ for (i = 0; i < length; i++) BIO_printf(bio_out, "%02x", ((unsigned char*)ciphertext)[i]); BIO_printf(bio_out, "\n\n"); /* Start the decryption process */ /* First, copy the original IV data back to the IV array - as it was overwritten * during the encryption process */ memcpy(iv, iv_data, AES_BLOCK_SIZE); /* Reset how far we've gone through the IV */ num = 0; /* Carry out the decryption */ AES_cfb1_encrypt(ciphertext, plaintext, length, &key, iv, &num, AES_DECRYPT); BIO_printf(bio_out, "Recovered plaintext: "); /* print out the plaintext */ for (i = 0; i < length; i++) BIO_printf(bio_out, "%c", ((unsigned char*)plaintext)[i]); BIO_printf(bio_out, "\n\n"); BIO_free(bio_out); free(ciphertext); free(plaintext); return 0; } When I run it, the output which I receive is: Original plaintext: Internet is a wonderful mechanism for making a foolof yourself in front of a very large audience Ciphertext: 92c0883c54eb8df072b43278000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Recovered plaintext: Internet is d:\ananthasayanan\stuff\projects\programming\openssl\openssl-1.0.0d\demos\crypto\low_level\ciphers\symmetric\aes\aes_cfb 1_128\x64\Release>aes_cfb1_128.exe Original plaintext: Internet is a wonderful mechanism for making a fool of yourself in front of a very large audience Ciphertext: 92c0883c54eb8df072b43278000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Recovered plaintext: Internet is As you can see, the ciphertext that is produced is only 12 bytes in length. Hence, the recovered plaintext has only 12 characters. I have had a look atthe source-code for AES_cfb1_encrypt and the comment says that the input should be "packed". What does this mean? Am I doing something wrong or is there a bug with AES-CFB1? Thanks, Anantha