AES: Advanced Encryption Standard.
Supported Modes: GCM, CCM, ECB, CBC, CFB, OFB and CTR.
AES Example:
Generate Key:
We should first generate Symmetric key (CELIB::SymmetricKey):
AES can accepts key with size: 128, 192 or 512 bit (16, 24 or 32 byte).
For more security, CryptoEngine uses X917RNG standard - from ANSI 9.17 - (if available) to generate keys.
//Generate 128 bit key size: CELIB::SymmetricKey key(128); //Print key's data in (human-readable) form : std::cout << "\nkey.toString(): " << key.toString().toStdString() << std::endl;
output:
key.toString(): (Class:[CELIB::SymmetricKey], Key-Hex: [E8FDC001DA97CA64338D9554CB6DCE4A8885855750130CD09628AA6D406A4ACF53AAFFE01273D2B66EAED EBB70708FD71B0E54BABDC5308E29EF6A337F635ED0384E318CD121A99FA5591C61156144485E6B790C126 92F07EEC1FA572C06745A2A80975E9CA813E539FAD594B030531838F2B36FC26ED0120A17FD8C262C948F], key Size: [128].)
Create AES Object and use it
After generating key, we can pass it's reference to AES Constructor:
CELIB::AES aes(key); //! connect aes object with caller class to catch errors, more details on Error Handling page: //connect(&aes, SIGNAL(error(QString)), this, SLOT(errorString(QString))); //Plain & Cipher texts: QByteArray plain("Testing AES"), cipher, recover; bool isOk; //Encrypt using ECB mode: aes.setOPMode(CELIB::ECB); //With ECB no need to iv. cipher = aes.encrypt(plain, &isOk); if(isOk) std::cout << "\nEncryption successful." << std::endl; else std::cout << "\nEncryption FAILED." << std::endl; std::cout << "\nCipher: [" << cipher.toHex().toUpper().data() << "].\n"; //Decrypt using same key and mode -and iv-: recover = aes.decrypt(cipher, &isOk); if(isOk) std::cout << "\nDecryption successful." << std::endl; else std::cout << "\nDecryption FAILED." << std::endl; std::cout << "\nRecover: [" << recover.data() << "].\n"; Q_ASSERT(plain == recover);
Change AES object Key:
We can change key, iv or mode at any time we need-to:
//Create new key with size 256 bits: CELIB::SymmetricKey key256(256); QByteArray iv = QByteArray::fromHex("000102030405060708090A0B0C0D0E0F"); //Change aes object key: aes.setKey(key256); //Change mode: aes.setOPMode(CELIB::CBC); //Change iv: aes.setIV(iv); //Now you can use it to encrypt/decrypt as above. //We can also print aes data in (human-readable) form: std::cout << "\naes.toString(): " << aes.toString().toStdString() << std::endl; /* output: aes.toString(): [CELIB::AES::toString():], Key:[!HIDDEN!], KeyLength:[32], IV-Hex:[000102030405060708090A0B0C0D0E0F], IVLength:[16], OPMode:[CBC]. */
Note that you can encrypt/decrypt files with same way.