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? > >