Skip to main content

A tool for encrypting and decrypting files using distributed keys

Project description

Splinterglyph

Problem Statement

Suppose we find ourselves in the following situation:

You and four of your friends want to encrypt a file. You each get one of five (different) cryptographic keys. If any three of you combine your keys, you can decrypt the file.

We might imagine the following equivalent problem:

You want to encrypt a file, but implement your own (very secure) multifactor authentication. You produce multiple cryptographic keys, but keep one on your laptop, one on your phone, one in a thumb drive in a bank safe deposit box, one printed on a slip of paper under your bed, etc. You suspect that you might lose a few of them, but if you combine any three keys, you can decrypt the file.

This repo is designed to solve the preceding sort of problems. Because the user may need to record or recover some of the keys manually, they are encoded in a (relatively) human-friendly fashion.

Installation

Assuming you have already installed pip:

python3 -m pip install --user virtualenv
python3 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt

Usage

Encryption

Suppose you have a file called my_data that you'd like to encrypt. You could then run

splinterglyph_encrypt my_data

This would produce an encrypted output file called my_data.splinterglyph and would print out a set of key shares, which might look something like this:

1-even,disturb,equipment,cleanups,tomo,biagiotti,favoritos,bl,obtained,komatsu,approachable,mowers,arrange

2-even,athol,lost,aloud,condon,wardrobes,herbs,fishermans,dielectric,cpc,galesburg,withdrew,hercegovina

3-even,tissue,break,oreck,solver,mangas,punishable,mutiny,superoxide,dubbing,crucifix,aaaa,celle

4-even,refractive,protect,pulley,tx,frosted,anthracite,rests,floodplains,liquor,excesses,glowing,emphasises

5-even,dichroic,administrator,beeson,memoria,inconvenience,instructor,backwoods,broadcasts,minton,sprout,convictions,standoff

By default, splinterglyph_encrypt produces 5 shares and requires 2 to decrypt. If you, e.g., wanted to generate 7 shares but require 3 to decrypt, you would run:

splinterglyph_encrypt my_data --N 7 --M 3

You can try

splinterglyph_encrypt -h

to see all command line options.

Decryption

Continuing the example in the previous section, you could decrypt the file my_data.splinterglyph using the 1st and 3rd key shares by running:

splinterglyph_decrypt my_data.splinterglyph my_data.recovered --shares "3-even,tissue,break,oreck,solver,mangas,punishable,mutiny,superoxide,dubbing,crucifix,aaaa,celle  1-even,disturb,equipment,cleanups,tomo,biagiotti,favoritos,bl,obtained,komatsu,approachable,mowers,arrange"

That command would write the decrypted data to my_data.recovered.

Note that in that example, any two (distinct) key shares would have been sufficient to decrypt, and the order of the shares doesn't matter.

You can try

splinterglyph_decrypt -h

to see all command line options; this includes an option to pass the key shares as a file (as opposed to the command line).

Details

There's two parts to this process: splitting a secret key and actually encrypting the file. We split the key using Shamir's secret sharing protocol. The code for this exists entirely within the Splinterglyph repository, but is shamelessly stolen from Jonathan Queiroz' repo. The actual encryption is done using AES. By default, the system uses 128-bit AES, but the --key_bit_length allows the user to upgrade that to 192 or 256 bit keys.

The perceptive reader may have expected that the cryptographic key shares might look like 0x17a7503ce..., whereas they actually look like 3-even,tissue,break,oreck,solver,mangas,.... What's going on? Well, we imagine that the user may wish to record some of their key shares physically, e.g., by printing them onto a piece of paper. In that case, they may need to retype them manually in order to decrypt the file. It can be difficult to type long random strings perfectly, so we encode the key shares as a list of words chosen from the most common 216 English words. (The "words" are sometimes just common strings, like aaaa).

In addition to encryption/decryption, we also perform message authentication on the ciphertext. Therefore, if somebody monkeys with your encrypted file, you'll see an error message like:

###############################
##  FILE TAMPERING DETECTED  ##
###############################

followed by a Python traceback. The tampered file will not be decrypted.

When you encrypt a file, a number of parameters get specified (like the AES encryption strength and the number of shares required to decrypt). This metadata is stored as part of the encrypted file, so you no longer need to keep track of that. If, however, you forget how many shares you need, a quick trick for recovering that is by examining the top of the encrypted file. The first handful of bytes are human readable and look something like this:

SPLINTERGLYPH v0001
Made 00005 shares; require 00002
2023-06-17 16:23:07
Key len: 0128
prime_mod length: 000025
<followed by binary nonsense>

In this example, you'd need two key shares to decrypt the file.

We also share a general warning about "deleting" files. The presumptive behavior is that after encrypting a file, the user would destroy the original plaintext file. On modern computing systems this may be more difficult than it seems because fragments of files may persist in the file system. On a file system with journaling, this problem may be even worse. Using an encrypted file partition can address this problem, but only if access to that encrypted system is secure. In any event, if the user is particularly concerned about security, they should consider this issue.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

splinterglyph-0.1.8.tar.gz (273.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

splinterglyph-0.1.8-py3-none-any.whl (274.0 kB view details)

Uploaded Python 3

File details

Details for the file splinterglyph-0.1.8.tar.gz.

File metadata

  • Download URL: splinterglyph-0.1.8.tar.gz
  • Upload date:
  • Size: 273.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for splinterglyph-0.1.8.tar.gz
Algorithm Hash digest
SHA256 37144fbf5cecbd180db7ddf673d48fc7709a9c3e538b65f4d6b8afbe8d5e03a0
MD5 dfb4d19d5e7b187d46f70203d423c16b
BLAKE2b-256 8498ca88c237e72e008b17b855b65657f83be05aaaf2b7a69ab1faa92bfbe86a

See more details on using hashes here.

File details

Details for the file splinterglyph-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: splinterglyph-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 274.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for splinterglyph-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 6531f4d04b9bb64dff6c09c65515b12d19b2e1f37b3c3a5e3e7e38e3a6951627
MD5 379b983fb8c68834ba0a1bbbd0e71946
BLAKE2b-256 52d920ff412e1a291223ce4e901e6d05ab22e0d2c9120ac31f0b03d70aefa0ec

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page