Archive
Encrypting/Decrypting For Confidentiality
Depending on how they’re designed, there are up to 5 services that a cryptographic system can provide to its users:
In my last post, “Hashing For Integrity“, we used the Poco.Crypto library to demonstrate how one-way hash functions can provide for message integrity over unsecured communication channels. In this post, we’ll use the library to “Encrypt/Decrypt For Confidentiality“.
The figure below shows how a matched symmetric key/cipher pair provides the service of “confidentiality” to system users. Since they are “symmetric“, the encryption key is the same as the decryption key. Anyone with the key and matching cipher can decrypt a message (or file) that was encrypted with the same key/cipher pair.
The gnarly issue with symmetric key cryptographic sytems is how to securely distribute copies of the key to those, and only those, users who should get the key. Even out-of-band key transfers (via e-mail, snail mail, telephone call, etc) are vulnerable to being intercepted by “bad guys“. The solution to the “secure key distribution” problem is to use asymmetric key cryptography in conjunction with symmetric key cryptography, but that is for a future blog post.
To experiment with symmetric key encryption/decryption using the Poco.Crypto library, we have added a MyCrypto class to the bulldozer00/PocoCryptoExample GitHub repository.
The design of the Poco.Crypto library requires users to create a CipherKey object directly, and then load the key into a Cipher acquired through a CipherFactory singleton.
The MyCipher class data members and associated constructor code are shown below:
After the MyCipher constructor has finished executing, the following CipherKey characteristics appear in the console:
Note that for human readability, the 256 bit key value is printed out as a series of 64, 4 bit hex nibbles.
So, where did we get the “aes-256-cbc” key name from, and are there different key generation algorithms that we could’ve used instead? We got the key name from the openssl library by entering “openssh -h” at the command line:
Using “des-ede” as the key name, we get the following console output after the constructor has finished executing:
The number of bits in a CipherKey is important. The larger the number of bits, the harder it is for the bad guys to crack the system.
So, now that we have a matched CipherKey and Cipher object pair, let’s put them to use to encrypt/decrypt a ClearText message. As you can see below, the Poco.Crypto library makes the implementation of the MyCipher::encryptClearTextMsg() and MyCipher::decryptCipherTextMsg() member functions trivially simple.
The unit test code that ensures that the ClearText message can be encrypted/decrypted is present in the MyCipherTest.cpp file:
The console output after running the test is as anticipated:
So, there you have it. In this post we employed the Poco.Crypto library to learn how to use and test the facilities provided by the library to simulate a crypto system that provides its users with confidentiality using encryption/decryption. I hope this post was useful to those C++ programmers who are interested in cryptographic systems and want to get started coding with the Poco.Crypto library.