Hi,

The encrypted output is not a NULL terminated string so strlen will not
work.

>> EVP_DecryptUpdate(&ctx, (unsigned char *)plaintextz, &out_len, (unsigned
char *)ciphertext, strlen(ciphertext));

Use the length output from the encryption part.

- re

On Sun, May 1, 2011 at 12:27 AM, derleader mail <derlea...@abv.bg> wrote:

>  Hi,
>    I'm trying to code a C program that can convert very big number of
> characters. The problem is that there is an error in decryption.
>
> This is the code:
>
> //gcc test_Blowfish.c -L/usr/local/ssl/lib/ -lssl -lcrypto -Wall
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <strings.h>
> #include <openssl/blowfish.h>
> #include <openssl/evp.h>
>
> int main(void) {
>
>     char plaintext[1024] = "{aaX{aaX57 : {223 :
> 2323}}{}{}{}{}{}{3535:42424}242424242242424243r23r23r23r23r23r23r3r{}pppa57
> : {223 :
> 2323}}{}{}{}{}{}{3535:42424}242424242242424243r23r23r23r23r23r23r3r{}pppa{aaX57
> : {223 :
> 2323}}{}{}{}{}{}{3535:42424}242424242242424243r23r23r23r23r23r23r3r{}pppa";
>     char plaintextz[1024];
>     char ciphertext[1024]= {0,};
>     char mykey[EVP_MAX_KEY_LENGTH] = "blowfish_key";
>     char iv[EVP_MAX_IV_LENGTH] = "blowfish";
>     int tmp_len = 0, in_len, out_len=0;
>     EVP_CIPHER_CTX ctx;
>
>     //memset(mykey,0,sizeof(mykey));
>     //memset(iv,0,sizeof(iv));
>
>
>
>     printf("No encrypt: %s\n", plaintext);
>     printf("No encrypt size: %d\n", strlen(plaintext));
>
>     //Encrypt
>     EVP_EncryptInit(&ctx, EVP_bf_cfb(), (unsigned char *)mykey, (unsigned
> char *)iv);
>     EVP_EncryptUpdate(&ctx, (unsigned char *)ciphertext, &out_len,
> (unsigned char *)plaintext, strlen(plaintext));    //Block through the mem
> to be encrypted
>     tmp_len += out_len;
>     EVP_EncryptFinal(&ctx, (unsigned char *) &ciphertext[out_len],
> &out_len); //Finish any remaining encryption and throw a pad on
>     tmp_len += out_len;
>     printf("Encrypted: %s\n", ciphertext);
>     printf("Encrypted size: %d\n", tmp_len);
>
>     //Reset memory for Decryption
> //    memset(plaintext,0,sizeof(plaintext));
>     in_len = tmp_len;
>     out_len = tmp_len = 0;
>
>     //decrypt
>     EVP_DecryptInit(&ctx, EVP_bf_cfb(), (unsigned char *)mykey, (unsigned
> char *)iv);
>     EVP_DecryptUpdate(&ctx, (unsigned char *)plaintextz, &out_len,
> (unsigned char *)ciphertext, strlen(ciphertext));
>     tmp_len += out_len;
>     EVP_DecryptFinal(&ctx, (unsigned char *)&plaintextz[out_len],
> &out_len);
>     tmp_len += out_len;
>
>     //Zero out the pad
>     memset(&plaintext[tmp_len],0,(int)(sizeof(plaintext)) - tmp_len);
>
>     printf("Decrypted : %s\n", plaintextz);
>     printf("Decrypted size: %d\n", tmp_len);
>
>     printf("Block Size: %d\n",EVP_CIPHER_CTX_block_size(&ctx));
>
>     return 0;
> }
>
>
>
> This is the output:
>
> [root@localhost test]# ./a.out
> No encrypt: {aaX{aaX57 : {223 :
> 2323}}{}{}{}{}{}{3535:42424}242424242242424243r23r23r23r23r23r23r3r{}pppa57
> : {223 :
> 2323}}{}{}{}{}{}{3535:42424}242424242242424243r23r23r23r23r23r23r3r{}pppa{aaX57
> : {223 :
> 2323}}{}{}{}{}{}{3535:42424}242424242242424243r23r23r23r23r23r23r3r{}pppa
> No encrypt size: 267
> Encrypted: �A-�� W =?:�$�i �_�8:�F�wo#�5 � @D�mo��-I ���F�Q�J�#��F�0b� ;�`�
> C䦱�~6�)ހ�YG �ed�Ӕ�Z%�9!mdvϋ���\���QB��}�N ����@_�W�F�e"�
> Encrypted size: 267
> Decrypted : {aaX{aaX57 : {223 :
> 2323}}{}{}{}{}{}{3535:42424}242424242242424243r23r23r23r23r23r23r3r{}pppa57
> : {223 : 2323}}{}{}{}{}{}{3535:4242
> Decrypted size: 131
> Block Size: 1
>
> As youy see the decrypted size number is less that the original.
> Any idea where is the problem?
>
>

Reply via email to