Hi, this is a two part question. First in the cipherEncrypt16b function
below I try to encrypt a signle block with aes128, but I cant really use
EVP_CipherFinal_ex since it seems to put out and extra block of data even
tho its only 16bytes put in.. This part works tho when EVP_CipherFinal_ex is
commented out. The part that I find really strange here is in the secound
function called cipherDecrypt16b. When the EVP_CipherUpdate is run the data
is correctly added to the char array but the data length is set to 0.

#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rand.h>

#include <string>

using namespace std;

bool cipherEncrypt16b( const EVP_CIPHER *pCipherType, const string &rSalt,
const string &rUnencryptedData, string &rEncryptedData, const string &rKey,
const string &rIv )
{
    if (rUnencryptedData.size() == 16)
    {
        EVP_CIPHER_CTX ectx;

        EVP_CIPHER_CTX_init(&ectx);
        EVP_CipherInit_ex(&ectx, pCipherType, NULL, reinterpret_cast<const
unsigned char*>(rKey.c_str()), reinterpret_cast<const unsigned
char*>(rIv.c_str()), 1);

        unsigned char *pOutBuffer = new unsigned
char[rUnencryptedData.size() + EVP_MAX_KEY_LENGTH +1];
        memset(pOutBuffer, 0, rUnencryptedData.size() + EVP_MAX_KEY_LENGTH
+1);

        int outLength;
        EVP_CipherUpdate(&ectx, pOutBuffer, &outLength,
            reinterpret_cast<const unsigned
char*>(rUnencryptedData.c_str()), static_cast<int>(rUnencryptedData.size())
);

        rEncryptedData.append(reinterpret_cast<char*>(pOutBuffer),
outLength);


//         memset(pOutBuffer, 0, rEncryptedData.size() + EVP_MAX_KEY_LENGTH
+1);
//         outLength = 0;
//
//         EVP_CipherFinal_ex(&ectx, pOutBuffer, &outLength);
//         rUncryptedData.append(reinterpret_cast<char*>(pOutBuffer),
outLength);


        EVP_CIPHER_CTX_cleanup(&ectx);

        if( pOutBuffer )
        {
            delete[] pOutBuffer;
        }
        pOutBuffer = NULL;

        return true;
    }
    return false;
}

bool cipherDecrypt16b( const EVP_CIPHER *pCipherType, const string &rSalt,
const string &rEncryptedData, string &rUncryptedData, const string &rKey,
const string &rIv )
{
    if (rEncryptedData.size() == 16)
    {
        EVP_CIPHER_CTX ectx;

        EVP_CIPHER_CTX_init(&ectx);
        EVP_CipherInit_ex(&ectx, pCipherType, NULL, reinterpret_cast<const
unsigned char*>(rKey.c_str()), reinterpret_cast<const unsigned
char*>(rIv.c_str()), 0);


        unsigned char *pOutBuffer = new unsigned char[rEncryptedData.size()
+ EVP_MAX_KEY_LENGTH +1];
        memset(pOutBuffer, 0, rEncryptedData.size() + EVP_MAX_KEY_LENGTH
+1);

        int outLength = 0;
        EVP_CipherUpdate(&ectx, pOutBuffer, &outLength,
            reinterpret_cast<const unsigned char*>(rEncryptedData.c_str()),
static_cast<int>(rEncryptedData.size()) );

        rUncryptedData.append(reinterpret_cast<char*>(pOutBuffer),
outLength);

        memset(pOutBuffer, 0, rEncryptedData.size() + EVP_MAX_KEY_LENGTH
+1);
        outLength = 0;

        EVP_CipherFinal_ex(&ectx, pOutBuffer, &outLength);
        rUncryptedData.append(reinterpret_cast<char*>(pOutBuffer),
outLength);

        EVP_CIPHER_CTX_cleanup(&ectx);

        if( pOutBuffer )
        {
            delete[] pOutBuffer;
        }
        pOutBuffer = NULL;

        return true;
    }
    return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
    string in_d = "0123456789012345";
    string ut_d;
    string salt = "";

    string key = "5432109876543210";
    string iv = "5432109876543210";

    string unenc;

    bool res = cipherEncrypt16b(EVP_aes_128_cbc(), "", in_d, ut_d, key, iv);
    bool res2 = cipherDecrypt16b(EVP_aes_128_cbc(), "", ut_d, unenc, key,
iv);

    return 0;
}

/regards
Johan Foglemark

Reply via email to