OpenSSL is the most important library we will be using if we are to use some cryptographic functions on a Linux computer. There are hundreds of variations of cryptographic algorithms and related functions are available on Linux terminal with OpenSSL. In this post, I would like to note down few useful things we can do with OpenSSL library on Linux.
When dealing with various files and data types, sometimes it is useful to convert everything into text format. Base64 is an encoding technique which we can use to convert different data into text format and then decode from text format to the original format. Let's see how we can do it.
First of all, let's select an image file in jpg format. We are going to encode this image file in base64 format as follows.
cat old-house.jpg | openssl enc -base64 >> encoded-image.jpg
Now, it you try to open the encoded image file, you will see that you cannot open in as a usual image file. However, the nice thing is, you can open the encoded image file using a text editor because the content is printable characters now. Let's decode the encoded image file back to the original format.
cat encoded-image.jpg | openssl enc -base64 -d >> decoded-image.jpg
Data Encryption Standard (DES):
DES is a little bit older data encryption algorithm which we don't have to use nowadays. Anyway, with OpenSSL library, we can use DES as follows to encrypt data.
openssl enc -des -a -in plantext.txt -out ciphertext.des
Once encrypted, we can use the following command to decrypt the data back to the plain text.
openssl enc -des -d -a -in ciphertext.des -out plaintext.tex
Advanced Encryption Standard (AES):
AES is a better and stronger encryption algorithm compared to DES. We can encrypt a file using AES and then decrypt the file back to the plain text using the following two commands.
openssl aes-256-cbc -in plaintext.txt -out ciphertext.aes
openssl aes-256-cbc -d -in ciphertext.aes -out plaintext.txt
Rivest, Shamir, Adleman (RSA):
When we are browsing web on our computer or mobile phone through a secure channel, the encryption algorithm which helps us most importantly is RSA. It is an asymmetric key encryption algorithm where we have two keys called as Public key and Private key. Private key is what we always keep to ourselves while the Public key can be distributed among everybody.
First of all, we need to generate a key pair in order to use RSA. Let's generate the private key and public key using the following two commands.
openssl genrsa -out private_key.pem 1024
openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout
If you check the local directory where you were when running the above commands, now you should be able to see that two new files are created as private_key.pem and public_key.pem which are our keys. Now, we can encrypt data using RSA. Let's say we are going to encrypt a text file so that only a friend can see it. Then, we have to use the friend's public key during the encryption as follows.
openssl rsautl -encrypt -inkey public_key.pem -pubin -in plaintext.txt -out ciphertext.txt
Now, when your friend decrypt the cipher text, he or she should use his/her private key as follows.
openssl rsautl -decrypt -inkey private_key.pem -in ciphertext.txt -out plaintext.txt
Digital Signature of a Message:
When sending an encrypted message to someone, sometimes we need to prove that we are the person who sent the message. Just because we use RSA encryption as above, we cannot prove that we sent it. In order to prove the senders identity, we can use digital signatures. A digital signature is nothing other than just a Hash value of the original message encrypted using the private key of the sender. Since the private key of someone is always with that perform, a digital signature can be produced only by the owner of the sender's private key. We can digitally sign as follows using the RSA private key.
openssl dgst -sha256 -sign private_key.pem -out signature.txt plaintext.txt
Now, at the recipients side, he or she can verify the senders signature by decrypting the signature file using the senders public key (which is available) and then recalculate the Hash value of the original message. Following command illustrates that functionality.
openssl dgst -sha256 -verify public_key.pem -signature signature.txt plaintext.txt
There are so many things we can do with the OpenSSL library. It is up to you to explore it further.