Skip to main content

Using Python for GPG/PGP File Encryption - Part 2

Previously we looked at creating keys, importing public and private keys and the overall setup of gnupg with python. This time around, we're going to take a look at file encryption. Overall the file encryption process is fairly general/easy. But it lacks in the area of scaleablilty, ie to start, you'll only be encrypting one file at a time, which can be done outside of Python with ease. The idea of going over everything in Python, is that you can setup a script to encrypt multiple files in a folder (look for that in Part 3).

Assumptions; you have python, and python-gnupg installed, and a public key from someone you want to encrypt and send files to imported to your keystore home (see Part 1 for more information here.

Let's get started with Python file encryption. Start off by getting into your python shell, and enter the following:

>>> import os
>>> import gnupg
>>> gpg_home = "/path/to/keyfile/.gnupg"
>>> gpg = gnupg.GPG(gnupghome=gpg_home)
>>> pub_key = 'fingerprint of public key'
>>> source = "/path/to/file.txt"

OK, let's take a look at what we have so far. We've setup our environment with the keyfile that gnupg is going to use, entered the path and name of the file we're going to encrypt, and told the system what public key to use. Let's keep going:

>>> unenc_file = open(source, "rb")
>>> enc_file = source+".pgp"

Pause. What we have here is that we've opened the file we want encrypted (because that's how pgp works), and we've setup the "pgp" extension for the final encrypted file. Now, you can alternate "pgp" and "gpg". Make sure you and the person you're sending this to know which extension to expect, however both work the same way.

>>> gpg.encrypt_file(unenc_file,pub_key,always_trust=True,output=enc_file)

Now, this line here takes all the variables we've just setup and completes the encryption.

>>> unenc_file.close()
>>> exit()

These last two lines closes the unencrypted file and exits the python shell. You should now have one unencrypted file and on encrypted one.

Now, the only other consideration is if you need to sign the file with your private key. This can be done by simply adding the variable:

>>> sign_key = 'fingerprint of private key'

And changing the GPG encryption line to:

>>> gpg.encrypt_file(unenc_file,pub_key,sign=sign_key,always_trust=True,output=enc_file)

And that's it. You can now encrypt one file at a time with python. Next time on this topic, we'll setup a script to automate the process and encrypt all the files in a specified folder.

Comments

Popular posts from this blog

Using Python for GPG/PGP File Encryption - Part 1

So, this will be the start of a series that will build a python script for GPG/PGP file encryption. In this post, we'll look at installing gnupg for python and using python to setup the keystore, create a private key, exporting the associated public key, and importing a public key. Now everything done here can be done with simple gnupg commands, but learning how to do this with python will help in understanding the script we'll be building to complete file encryption. I will be covering non-python gnupg commands in a future post. Additionally, the folks at the python-gnupg site over at pythonhosted.org have done a really great job at documenting everything (link to their site at the bottom). The stuff I'll be going over will be more of a start-to-finish for anyone that may get lost in the muck of doing stuff with python. Full Disclosure #1: Any key identifier throughout the series of posts is FICTITIOUS and DOES NOT represent any real key, either associated with myself or...

Windows Server 2008: Log on as batch job

From time to time, I have to set up some scheduled tasks that required a dedicated account to run. And when doing so, I'll usually forget that the dedicated account usually isn't given any more permissions than what it needs to complete the task at hand. So, after setting up the task, Windows will usually yell at me and say "The account needs batch job rights". So here's how to grant batch job permissions on your server. Go to your start menu, and start searching for Local Security Policy In the left pane of the MMC that opens up, expand Local Policies, and highlight User Rights Assignment. Now, in the left right pane, locate "Log on as a batch job" and double click it. In the properties window that opens up, add the user or group that needs this permission. I find that if you have multiple service accounts running different tasks on the same server, it's easier to just add a group verses the individual a...

Replacing rsyslog with syslog-ng on RHEL 6.5

So...I had a piece of monitoring software that didn't play nice with the RHEL default rsyslog for log collection. The software was developed to only work with syslog-ng. I'll be going over the steps that I took, that worked for me, in replacing rsyslog with syslog-ng. I would imagine that these same steps should work for any Linux system similar to RHEL (Fedora, CentOS, etc.). For others (like Debein based distributions), I would need to look into that (coming in a future update to this post). First, remove rsyslog. You will need to keep the dependencies as they will be needed for syslog-ng: sudo rpm -e --nodeps rsyslog Next we will need to add the EPEL repository (more info can be found HERE ): wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm sudo rpm -ivh epel-release-6-8.rpm sudo yum repolist That last command will list all the installed repositories. You are simply verifying that the EPEL package has been installed. Now that we fi...