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.

Thank you very much for the reply. The problem is that the encryption and 
decryption must be on separate machines. I need a way to take the size of the 
encrypted message using language function like strlen      (). Is there other 
solution?

Regards
      
      - 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  
#include  

#include  
#include  
#include  



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