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?