Build cryptlib project. It will spit out a cryptlib.lib static library:
Copy C:\Users\mantvydas\Desktop\cryptopp\x64\Output\Release\cryptlib.lib
Including cryptlib.lib in a Project
Change project's runtime library to Multi-threaded - it has to use the same runtime library as cryptlib.lib:
Copy over all the header files from the crypto++ project to your project's folder like so:
Copy // code copy pasted from here https://www.cryptopp.com/w/images/b/bd/AES-CBC-Filter.zip
// crypto.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include "pch.h"
#include <iostream>
#include "aes.h"
#include <Windows.h>
#include "osrng.h"
using CryptoPP :: AutoSeededRandomPool;
#include <iostream>
using std :: cout;
using std :: cerr;
using std :: endl;
#include <string>
using std :: string;
#include <cstdlib>
using std :: exit;
#include "cryptlib.h"
using CryptoPP :: Exception;
#include "hex.h"
using CryptoPP :: HexEncoder;
using CryptoPP :: HexDecoder;
#include "filters.h"
using CryptoPP :: StringSink;
using CryptoPP :: StringSource;
using CryptoPP :: StreamTransformationFilter;
#include "aes.h"
using CryptoPP :: AES;
#include "ccm.h"
using CryptoPP :: CBC_Mode;
#include "assert.h"
int main ( int argc , char* argv[])
{
AutoSeededRandomPool prng;
byte key [AES :: DEFAULT_KEYLENGTH];
prng . GenerateBlock (key , sizeof (key));
byte iv [AES :: BLOCKSIZE];
prng . GenerateBlock (iv , sizeof (iv));
string plain = "CBC Mode Test" ;
string cipher , encoded , recovered;
/*********************************\
\*********************************/
// Pretty print key
encoded . clear ();
StringSource (key , sizeof (key) , true ,
new HexEncoder (
new StringSink (encoded)
) // HexEncoder
); // StringSource
cout << "key: " << encoded << endl;
// Pretty print iv
encoded . clear ();
StringSource (iv , sizeof (iv) , true ,
new HexEncoder (
new StringSink (encoded)
) // HexEncoder
); // StringSource
cout << "iv: " << encoded << endl;
/*********************************\
\*********************************/
try
{
cout << "plain text: " << plain << endl;
CBC_Mode< AES > :: Encryption e;
e . SetKeyWithIV (key , sizeof (key) , iv);
// The StreamTransformationFilter removes
// padding as required.
StringSource s (plain , true ,
new StreamTransformationFilter (e ,
new StringSink (cipher)
) // StreamTransformationFilter
); // StringSource
#if 0
StreamTransformationFilter filter (e);
filter . Put (( const byte * ) plain . data () , plain . size ());
filter . MessageEnd ();
const size_t ret = filter . MaxRetrievable ();
cipher . resize (ret);
filter . Get ((byte * ) cipher . data () , cipher . size ());
#endif
}
catch ( const CryptoPP :: Exception & e)
{
cerr << e . what () << endl;
exit ( 1 );
}
/*********************************\
\*********************************/
// Pretty print
encoded . clear ();
StringSource (cipher , true ,
new HexEncoder (
new StringSink (encoded)
) // HexEncoder
); // StringSource
cout << "cipher text: " << encoded << endl;
/*********************************\
\*********************************/
try
{
CBC_Mode< AES > :: Decryption d;
d . SetKeyWithIV (key , sizeof (key) , iv);
// The StreamTransformationFilter removes
// padding as required.
StringSource s (cipher , true ,
new StreamTransformationFilter (d ,
new StringSink (recovered)
) // StreamTransformationFilter
); // StringSource
#if 0
StreamTransformationFilter filter (d);
filter . Put (( const byte * ) cipher . data () , cipher . size ());
filter . MessageEnd ();
const size_t ret = filter . MaxRetrievable ();
recovered . resize (ret);
filter . Get ((byte * ) recovered . data () , recovered . size ());
#endif
cout << "recovered text: " << recovered << endl;
}
catch ( const CryptoPP :: Exception & e)
{
cerr << e . what () << endl;
exit ( 1 );
}
/*********************************\
\*********************************/
return 0 ;
}