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 [email protected]
Automated List Manager [EMAIL PROTECTED]