Search code examples
encryptioncryptographyaescrypto++

Example of AES using Crypto++


I have been searching the Internet for good c++ AES code sample/tutorial that teaches the basics of the encryption technology and the use of the Library but so far I have had no luck getting decent material.

good: Easy to understand (Just the basics for on the go study).


Solution

  • Official document of Crypto++ AES is a good start. And from my archive, a basic implementation of AES is as follows:

    Please refer here with more explanation, I recommend you first understand the algorithm and then try to understand each line step by step.

    #include <iostream>
    #include <iomanip>
    
    #include "modes.h"
    #include "aes.h"
    #include "filters.h"
    
    int main(int argc, char* argv[]) {
    
        //Key and IV setup
        //AES encryption uses a secret key of a variable length (128-bit, 196-bit or 256-   
        //bit). This key is secretly exchanged between two parties before communication   
        //begins. DEFAULT_KEYLENGTH= 16 bytes
        CryptoPP::byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ];
        memset( key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH );
        memset( iv, 0x00, CryptoPP::AES::BLOCKSIZE );
    
        //
        // String and Sink setup
        //
        std::string plaintext = "Now is the time for all good men to come to the aide...";
        std::string ciphertext;
        std::string decryptedtext;
    
        //
        // Dump Plain Text
        //
        std::cout << "Plain Text (" << plaintext.size() << " bytes)" << std::endl;
        std::cout << plaintext;
        std::cout << std::endl << std::endl;
    
        //
        // Create Cipher Text
        //
        CryptoPP::AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
        CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, iv );
    
        CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink( ciphertext ) );
        stfEncryptor.Put( reinterpret_cast<const unsigned char*>( plaintext.c_str() ), plaintext.length() );
        stfEncryptor.MessageEnd();
    
        //
        // Dump Cipher Text
        //
        std::cout << "Cipher Text (" << ciphertext.size() << " bytes)" << std::endl;
    
        for( int i = 0; i < ciphertext.size(); i++ ) {
    
            std::cout << "0x" << std::hex << (0xFF & static_cast<CryptoPP::byte>(ciphertext[i])) << " ";
        }
    
        std::cout << std::endl << std::endl;
    
        //
        // Decrypt
        //
        CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
        CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, iv );
    
        CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( decryptedtext ) );
        stfDecryptor.Put( reinterpret_cast<const unsigned char*>( ciphertext.c_str() ), ciphertext.size() );
        stfDecryptor.MessageEnd();
    
        //
        // Dump Decrypted Text
        //
        std::cout << "Decrypted Text: " << std::endl;
        std::cout << decryptedtext;
        std::cout << std::endl << std::endl;
    
        return 0;
    }
    

    For installation details :

    sudo apt-get install libcrypto++-dev libcrypto++-doc libcrypto++-utils