Hello,
i have a problem with the Blowfish algorithm. When i encrypt a long
message i get the following error when i try to decrypt the message:
4156:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad
decrypt:.\crypto\evp\evp_enc.c:454:
The message length is form 10 to 450 (or more) characters. The funny
thing is
even though i hash the key with MD5 the length of the message i can
decrypt seems to depend on the key i choose to hash and further more
it looks like it depend on the content of the message itself as well.
The message contains only characters.
I use OpenSSL 0.9.8b on Windows XP with Visual Studio 2005.
Any help will be appreciated.
Regards,
Andy
And here is the code i use for encryption and decryption:
#include <iostream>
#include <string>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/applink.c>
#pragma comment(lib, "libeay32.lib")
using namespace std;
void hashtheKey (char* key, char* output)
{
OpenSSL_add_all_digests();
BIO *bio_err = BIO_new_fp(stdout, BIO_NOCLOSE);
EVP_MD_CTX mdctx;
const EVP_MD *md;
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len;
//Hash the Key
md = EVP_get_digestbyname("md5");
if(!md) {
cout << "Unknown message digest" << endl;
return;
}
string hash;
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
EVP_DigestUpdate(&mdctx, key, strlen(key));
EVP_DigestFinal_ex(&mdctx, md_value, (unsigned int *)&md_len);
EVP_MD_CTX_cleanup(&mdctx);
for (int i = 0; i < md_len; i++)
hash += md_value[i];
strcpy(output, hash.c_str());
}
int blowencrypt (char* key, char* input, char* output)
{
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
BIO *bio_err = BIO_new_fp(stdout, BIO_NOCLOSE);
int outlen = 0, tmplen = 0;
unsigned char iv[] = {0,1,2,3,4,5,6,7};
char* hash = new char[EVP_MAX_MD_SIZE];
hashtheKey(key, hash);
cout << "Hashed key: " << hash << endl;
//Encrypt the message
char *encodebuffer = new char[strlen(input) +
EVP_MAX_BLOCK_LENGTH - 1];
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_bf_cbc(), NULL, (const unsigned
char*)hash, iv);
if(!EVP_EncryptUpdate(&ctx, (unsigned char*)encodebuffer,
&outlen, (const
unsigned char*)input, strlen(input)))
{
ERR_print_errors(bio_err);
BIO_free_all(bio_err);
}
tmplen += outlen;
if(!EVP_EncryptFinal(&ctx, (unsigned char*)encodebuffer +
tmplen, &outlen))
{
ERR_print_errors(bio_err);
BIO_free_all(bio_err);
}
tmplen += outlen;
string chipher;
for (int i = 0; i < tmplen; i++)
chipher += encodebuffer[i];
EVP_CIPHER_CTX_cleanup(&ctx);
strcpy(output, chipher.c_str());
return tmplen;
}
void blowdecrypt (char* key, char* input, int len, char* output)
{
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
BIO *bio_err = BIO_new_fp(stdout, BIO_NOCLOSE);
EVP_CIPHER_CTX ctx;
int outlen = 0, tmplen = 0;
unsigned char iv[] = {0,1,2,3,4,5,6,7};
char *hash = new char[EVP_MAX_MD_SIZE];
hashtheKey(key, hash);
cout << "Hashed key: " << hash << endl;
char *decodebuffer = new char[len + EVP_MAX_BLOCK_LENGTH];
EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit_ex(&ctx, EVP_bf_cbc(), NULL, (const unsigned
char*)hash, iv);
if(!EVP_DecryptUpdate(&ctx, (unsigned char*)decodebuffer,
&outlen, (const
unsigned char*)input, len))
{
ERR_print_errors(bio_err);
BIO_free_all(bio_err);
}
tmplen = outlen;
if(!EVP_DecryptFinal_ex(&ctx, (unsigned char*)decodebuffer ,
&outlen))
{
ERR_print_errors(bio_err);
BIO_free_all(bio_err);
}
tmplen += outlen;
EVP_CIPHER_CTX_cleanup(&ctx);
string plain;
for (int i = 0; i < tmplen; i++)
plain += decodebuffer[i];
strcpy(output, plain.c_str());
}
int main()
{
//char *message = "This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.This is a secret."\
"This is a secret.This is a secret.This is a
secret.This is
a secret.";
char *message =
"01234567890123456789012345678901234567890123456789"\
"01234567890123456789012345678901234567890123456789"\
"01234567890123456789012345678901234567890123456789"\
"01234567890123456789012345678901234567890123456789"\
"01234567890123456789012345678901234567890123456789"\
"01234567890123456789012345678901234567890123456789";
cout << "Testing Blowfish encryption..." << endl << endl;
char *key = "This is a secret key";
int mylen = 0;
cout << strlen(message) << endl;
char *chipherbuffer = new char[strlen(message) * 2];
char* plainbuffer = new char[strlen(message) * 2];
mylen = blowencrypt(key, message, chipherbuffer);
cout << chipherbuffer << endl;
blowdecrypt(key, chipherbuffer, mylen, plainbuffer);
cout << plainbuffer << endl << endl;
cout << "Finished." << endl;
string temp = "";
getline(cin, temp);
return (0);
}
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List openssl-users@openssl.org
Automated List Manager [EMAIL PROTECTED]