Hello,

I added *8 in length for both encrypt/decrypt call to make it bit length.
AES_cfb1_encrypt(data, ciphertext, length*8, &key, iv, &num, AES_ENCRYPT);

As you can see, cfb128_1 has uses bit as length in API
void CRYPTO_cfb128_1_encrypt(const unsigned char *in, unsigned char *out,
                        size_t bits, const void *key, .......

unlike other cfb APIs.




On 11/01/2011 09:48 PM, Ananthasayanan Kandiah wrote:
Hi,

I would be grateful if you could expand on this. I've tried simply placing the bit length for the AES_set_encrypt_key call and it still produces the same result.


Thanks,
Anantha

On Tue, Nov 1, 2011 at 8:10 PM, re est <re.est1...@gmail.com <mailto:re.est1...@gmail.com>> wrote:

    Hi,

    I have tried your code and replaced the length param with bit length
    (*8) instead.
    It worked. It  seems that there are inconsistent with the usage of
    API.

    - re.est

    On Sun, Oct 30, 2011 at 4:55 PM, Ananthasayanan Kandiah
    <ananthasaya...@obtino.com <mailto:ananthasaya...@obtino.com>> wrote:
    > 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 at
    > the 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
    >
    >
    ______________________________________________________________________
    OpenSSL Project http://www.openssl.org
    User Support Mailing List openssl-users@openssl.org
    <mailto:openssl-users@openssl.org>
    Automated List Manager majord...@openssl.org
    <mailto:majord...@openssl.org>



Reply via email to