Thanks to Marek and Bill :) I have decided to use the EVP Aes version. This is my try. It worked fine for me.
Regards Martin #include <iostream> #include <stdio.h> #include <string.h> #include <cmath> #include <cstdlib> #include <openssl/aes.h> #include <openssl/evp.h> #include <openssl/rand.h> int AesEncrypt(const std::string &sAesKey, const std::string &ToEncrypt, std::string &Encrypted) { const int AesBlockSize=16; unsigned char cInitVector[AesBlockSize]; EVP_CIPHER_CTX oEncCtx; const EVP_CIPHER *oChiper=0; int retval=0; unsigned char *cOutBuffer=0; // Set aes key: if (sAesKey.length()==16) { oChiper = EVP_aes_128_cbc(); } else if (sAesKey.length()==32) { oChiper = EVP_aes_256_cbc(); } else { return -1; // Wrong key size. } // Create init vector and add him infront of encrypted output data: RAND_pseudo_bytes(cInitVector, AesBlockSize); Encrypted.assign((char *)cInitVector, ((char *)cInitVector)+AesBlockSize); // Create encryption context. EVP_CIPHER_CTX_init(&oEncCtx); EVP_EncryptInit_ex(&oEncCtx, oChiper, 0, (unsigned char *)sAesKey.c_str(), cInitVector); // Encrypt most of the data: int OutBufferByteLen = ToEncrypt.length()+2*AesBlockSize; cOutBuffer = new unsigned char[OutBufferByteLen]; retval = EVP_EncryptUpdate( &oEncCtx, cOutBuffer, &OutBufferByteLen, (unsigned char *)ToEncrypt.c_str(), ToEncrypt.length()); // Doese encryption fail? if (retval<0) { delete[] cOutBuffer; return retval; // Encryption error. } // Add encrypted data to output: Encrypted.append((char *)cOutBuffer, ((char *)cOutBuffer)+OutBufferByteLen); delete[] cOutBuffer; //Add last block+padding: OutBufferByteLen = 2*AesBlockSize; cOutBuffer = new unsigned char[OutBufferByteLen]; // To be sure add two blocks. retval = EVP_EncryptFinal_ex( &oEncCtx, cOutBuffer, &OutBufferByteLen); // Doese encryption fail? if (retval<0) { delete[] cOutBuffer; return retval; // Encryption error. } // Add encrypted data to output: Encrypted.append((char *)cOutBuffer, ((char *)cOutBuffer)+OutBufferByteLen); delete[] cOutBuffer; EVP_CIPHER_CTX_cleanup(&oEncCtx); return 0; // Success } int AesDecrypt(const std::string &sAesKey, const std::string &ToDecrypt, std::string &Decrypted) { const int AesBlockSize=16; unsigned char cInitVector[AesBlockSize]; EVP_CIPHER_CTX oEncCtx; const EVP_CIPHER *oChiper=0; int retval=0; unsigned char *cOutBuffer=0; // Set aes key: if (sAesKey.length()==16) { oChiper = EVP_aes_128_cbc(); } else if (sAesKey.length()==32) { oChiper = EVP_aes_256_cbc(); } else { return -1; // Wrong key size. } // Get init vector: const char *constInitVectorPtr = ToDecrypt.c_str(); for (int i=0; i<AesBlockSize; i++) { cInitVector[i] = *constInitVectorPtr; constInitVectorPtr++; } // Create decryption context. EVP_CIPHER_CTX_init(&oEncCtx); EVP_DecryptInit_ex(&oEncCtx, oChiper, 0, (unsigned char *)sAesKey.c_str(), cInitVector); // Decrypt most of the data: int OutBufferByteLen = ToDecrypt.length() - AesBlockSize; // Subtract the InitVec. cOutBuffer = new unsigned char[OutBufferByteLen]; retval = EVP_DecryptUpdate( &oEncCtx, cOutBuffer, &OutBufferByteLen, ((unsigned char *)ToDecrypt.c_str()) + AesBlockSize, // Remove the InitVector. OutBufferByteLen); // Doese encryption fail? if (retval<0) { delete[] cOutBuffer; return retval; // Encryption error. } // Add encrypted data to output: Decrypted.append((char *)cOutBuffer, ((char *)cOutBuffer)+OutBufferByteLen); delete[] cOutBuffer; //Add last block+padding: OutBufferByteLen = 2*AesBlockSize; cOutBuffer = new unsigned char[OutBufferByteLen]; // To be sure add two blocks. retval = EVP_DecryptFinal_ex( &oEncCtx, cOutBuffer, &OutBufferByteLen); // Doese encryption fail? if (retval<0) { delete[] cOutBuffer; return retval; // Encryption error. } // Add encrypted data to output: Decrypted.append((char *)cOutBuffer, ((char *)cOutBuffer)+OutBufferByteLen); delete[] cOutBuffer; EVP_CIPHER_CTX_cleanup(&oEncCtx); return 0; // Success } int main() { std::string ToEncrypt, Encrypted, Decrypted, AesKey; int retval=0; AesKey = "11111222223333344444555556666677"; // 32 Byte = 256 Bit key. ToEncrypt = "aaaaaaaaaaaaaabbbbbbbbbbbbbcccccccccccccccddddddddddddddddeeeeeeeeeeeeee"; OpenSSL_add_all_algorithms(); OpenSSL_add_all_ciphers(); OpenSSL_add_all_digests(); retval = AesEncrypt(AesKey, ToEncrypt, Encrypted); retval = AesDecrypt(AesKey, Encrypted, Decrypted); return 0; } -- Psssst! Schon vom neuen GMX MultiMessenger gehört? Der kanns mit allen: http://www.gmx.net/de/go/multimessenger ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List openssl-users@openssl.org Automated List Manager [EMAIL PROTECTED]