Recursive File Encryption in Python 3
Hello there, how’s it going? (Download script here)
In today’s post, I want to show you a short script to do recursive file encryption in Python 3 – using pyAesCrypt with AES encryption.
Its amazing how powerful this programming language is, really. This is mostly what I wanted to show you guys this time and one of the main reasons I keep coming back time after time to Python.
Using about 20 lines of code, we’re able to encrypt many files in seconds.
Anyway, this post will basically function as a introduction into encryption in Python 3. I had many posts about using encryption in my previous blog with PyCrypto – and I’m still a big fan. However, with Python 2.X in the midst of sunsetting, I figure its time to start looking at newer libraries.
I know there are recent forks for PyCrypto such as PyCryptodome, but in any case, its always good to have some variety in your arsenal.
With that said, pyAesCrypt seems to work rather seamlessly and provides a few different options for functionality – file encryption, stream encryption and in-memory encryption (sounds spicy ay?).
Encryption Using pyAesCrypt
Before we get into the recursive file encryption script, let’s take a look at their brief, yet effective example of basic file encryption:
import pyAesCrypt # encryption/decryption buffer size - 64K bufferSize = 64 * 1024 password = "foopassword" # encrypt pyAesCrypt.encryptFile("data.txt", "data.txt.aes", password, bufferSize) # decrypt pyAesCrypt.decryptFile("data.txt.aes", "dataout.txt", password, bufferSize)
As you can see its very simple and straight to the point.
All it requires is the file to be encrypted, the new file, a password and the buffer size – all of which are self-explanatory.
With that out of the way, let’s dive into the recursive encrypt script:
import pyAesCrypt import glob import os # Encryption/decryption buffer size - 64K bufferSize = 64 * 1024 # Get current directory curDir = os.getcwd() # Prompt user for password to encrypt files password1 = input('\n> Enter password to encrypt: ') print('\n> Beginning recursive encryption...\n\n') # Main loop to encrypt all files recursively for x in glob.glob('directory\\**\*', recursive=True): fullpath = os.path.join(curDir, x) fullnewf = os.path.join(curDir, x + '.aes') # Encrypt if os.path.isfile(fullpath): print('>>> Original: \t' + fullpath + '') print('>>> Encrypted: \t' + fullnewf + '\n') pyAesCrypt.encryptFile(fullpath, fullnewf, password1, bufferSize) # Remove file after encryption os.remove(fullpath)
We’ll simply prompt the user for a password and get right to business.
Using glob, we’ll point to the directory that we’re going inside off recursively. Remember to set the recursive parameter to True.
It’s important to use the full path in these cases since running the script from a different directory or other silly mistakes could cause one to encrypt their entire hard drive or something – remember, recursion!
Anyway we’ll make a check here using os.path.isfile to make sure we are dealing with an actual file and not a directory – that would return an error.
Finally we’ll encrypt the file and remove the original afterwords.
import pyAesCrypt import glob import os # Encryption/decryption buffer size - 64K bufferSize = 64 * 1024 # Get current directory curDir = os.getcwd() # Prompt user for password to decrypt files password1 = input('\n> Enter password to decrypt: ') print('\n> Beginning recursive decryption...\n\n') # Main loop to decrypt all files recursively for x in glob.glob('directory\\**\*', recursive=True): fullpath = os.path.join(curDir, x) fullnewf = os.path.join(curDir, os.path.splitext(x)[0]) # Decrypt if os.path.isfile(fullpath): print('>>> Encrypted: \t' + fullpath + '') try: pyAesCrypt.decryptFile(fullpath, fullnewf, password1, bufferSize) print('>>> Decrypted: \t' + fullnewf + '\n') os.remove(fullpath) # Remove encrypted file after decrypt except ValueError: print('>>> Error - Wrong password!\n')
There really isn’t much different in the decryption script, except for the main pyAesCrypt decrypt method of course.
The main thing is that you change the ‘directory‘ on the script to whatever directory you want to run the script in recursively.
Another thing to note is that you can comment out the os.remove(fullpath) in each script in case you don’t want to delete the original file.
Download Code
Hope you guys enjoyed this one, very simple, but for sure I will get into some more functionality provided by pyAesCrypt.
‘Till then, see you guys next time!
Hey! I love this!
Is there any way to do the same but copying files before encrypting? That is, leaving the originals as they are, copy them and encrypt these copies into another folder. Thanks!
Absolutely!
All you have to do is comment the last line of code in the encrypt script:
os.remove(fullpath)
So just add a # before it or remove that line of code (22).
Same applies for the decryption script (either add a # or remove line 22).
Hope that helps! 🙂
hi. can i ask why you used back slashes?
for x in glob.glob(‘directory\\**\*’, recursive=True):
for me only forward slashes work
for x in glob.glob(‘directory/**/*’, recursive=True):
thanks