dear all,
i am using openssl 0.9.8.e in M$ and compile in MSYS. i just want to encrypt a
string and then decrypt later. for the encryption, it is always ok. but for
decryption, it failed randomly. the word "randomly" means that for some cases,
the decryption is ok, but for other cases, it failed and always gave the error
information "Error in Decrypt final". for the failure situation, there are two
cases: one is that the decrypted string is correct compared with the source
string; the other is that the decrypted string is wrong since the final block
is lost.
i really feel frustrated due to the random failure and i can't find where the
error is. below are the encryption and decryption function. any help would be
very appreciated.
===============>encryption function
unsigned char *encode_string (char *data, unsigned char key[], unsigned char
iv[], int *output_len)
{
unsigned char *encrypt;
int buff_size, input_len, final_part;
EVP_CIPHER_CTX ctx;
#ifdef REG_DEBUG
FILE *fp;
#endif
input_len = strlen(data) + 1;
buff_size = (input_len / BUFFER + 1) * BUFFER + EVP_MAX_BLOCK_LENGTH;
/* if(input_len + IV_LEN > BUFFER)
buff_size = input_len + IV_LEN + EVP_MAX_BLOCK_LENGTH;
else
buff_size = BUFFER + EVP_MAX_BLOCK_LENGTH; */
encrypt = (unsigned char *)malloc(buff_size * sizeof(char));
memset(encrypt, 0, buff_size);
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit(&ctx, EVP_bf_cbc(), key, iv);
/* EVP_CIPHER_CTX_set_padding(&ctx, 0); */
if(!EVP_EncryptUpdate(&ctx, encrypt, output_len, data, input_len))
{
#ifdef REG_DEBUG
if((fp = open_file_to_do (CRYPTO_LOG, "w")))
{
fprintf(fp, "Error in encrypt update.");
fclose(fp);
}
#endif
}
else
{
if (!EVP_EncryptFinal(&ctx, encrypt + (*output_len), &final_part))
{
#ifdef REG_DEBUG
if((fp = open_file_to_do (CRYPTO_LOG, "w")))
{
fprintf(fp, "Error in encrypt final.");
fclose(fp);
}
#endif
}
else
*output_len += final_part;
}
EVP_CIPHER_CTX_cleanup(&ctx);
return encrypt;
}
===============>decryption function
`data' is from "read" function which reads from a file and `input_len' is the
return value of "read" function
unsigned char *decode_string (char *data, int input_len, unsigned char key[],
unsigned char iv[], int *output_len)
{
unsigned char *decrypt;
int buff_size, final_part;
EVP_CIPHER_CTX ctx;
#ifdef REG_DEBUG
FILE *fp;
#endif
buff_size = (input_len / BUFFER + 1) * BUFFER + EVP_MAX_BLOCK_LENGTH;
/* if(input_len + IV_LEN > BUFFER)
buff_size = input_len + IV_LEN + EVP_MAX_BLOCK_LENGTH;
else
buff_size = BUFFER + EVP_MAX_BLOCK_LENGTH; */
decrypt = (unsigned char *)malloc(buff_size * sizeof(char));
memset(decrypt, 0, buff_size);
EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit(&ctx, EVP_bf_cbc(), key, iv);
/* EVP_CIPHER_CTX_set_padding(&ctx, 0); */
if(!EVP_DecryptUpdate(&ctx, decrypt, output_len, data, input_len))
{
#ifdef REG_DEBUG
if((fp = open_file_to_do (CRYPTO_LOG, "w")))
{
fprintf(fp, "Error in Decrypt update.");
fclose(fp);
}
#endif
}
else
{
if (!EVP_DecryptFinal(&ctx, decrypt + (*output_len), &final_part))
{
#ifdef REG_DEBUG
if((fp = open_file_to_do (CRYPTO_LOG, "w")))
{
fprintf(fp, "Error in Decrypt final.");
fclose(fp);
}
#endif
}
else
*output_len += final_part;
}
EVP_CIPHER_CTX_cleanup(&ctx);
return decrypt;
}
_________________________________________________________________
Hotmail is redefining busy with tools for the New Busy. Get more from your
inbox.
http://www.windowslive.com/campaign/thenewbusy?ocid=PID28326::T:WLMTAGL:ON:WL:en-US:WM_HMP:042010_2