Skip to main content

A pure-Python Rijndael (AES) and PBKDF2 library. Python2.7- and Python3-compatible.

Project description

Overview

This package was a remedy to there being no PyPI-published, pure-Python Rijndael (AES) implementations, and that nothing available, in general, was compatible with both Python2 and Python3. The same is true of the PBKDF2 key-expansion algorithm.

The encryptor takes a source generator (which yields individual blocks). There are source-generators provided for both data from a variable and data from a file. It is trivial if you’d like to write your own. The encryptor and decryptor functions are written as generators. Decrypted data has PKCS7 padding. A utility function is provided to trim this (trim_pkcs7_padding).

The implementation includes Python2 and Python3 implementations of both Rijndael and PBKDF2, and chooses the version when loaded.

The default block-size is 128-bits in order to be compatible with AES.

This project is also referred to as pprp, which stands for “Pure Python Rijndael and PBKDF2”.

Installation

Install via pip:

$ sudo pip install pprp

Example

Encrypt and decrypt the data, and compare the results. This example works in both Python 2 and 3.

Top imports and defines:

import sys
import io
import os.path
import hashlib

import pprp
import pprp.config

# Make the strings the right type for the current Python version.
def trans(text):
    return text.encode('ASCII') if sys.version_info[0] >= 3 else text

passphrase = trans('password')
salt = trans('salt')
key_size = 32
data = ("this is a test" * 100).encode('ASCII')

Do the key-expansion:

key = pprp.pbkdf2(passphrase, salt, key_size)

Create a source from available data:

sg = pprp.data_source_gen(data)

Feed the source into the encryptor:

eg = pprp.rjindael_encrypt_gen(key, sg)

Feed the encryptor into the decryptor:

dg = pprp.rjindael_decrypt_gen(key, eg)

Sink the output to a variable (and automatically trim the padding):

decrypted = pprp.decrypt_sink(dg)

There is also a decrypt_to_file_sink sink that takes a file-object as the first argument.

Check the result:

assert data == decrypted

The following is a portion of the output of the example script (test/example.py). Notice that, due to this being an efficient, generator-based design, the encryption of each block is followed by a decryption:

2014-07-01 12:24:13,182 - pprp.source - DEBUG - Yielding [data] source block: (0)-(0)
2014-07-01 12:24:13,182 - pprp.adapters - DEBUG - Encrypting and yielding encrypted block: (0)
2014-07-01 12:24:13,183 - pprp.adapters - DEBUG - Decrypting and yielding decrypted block: (0)
2014-07-01 12:24:13,183 - pprp.source - DEBUG - Yielding [data] source block: (1)-(16)
2014-07-01 12:24:13,183 - pprp.adapters - DEBUG - Encrypting and yielding encrypted block: (1)
2014-07-01 12:24:13,183 - pprp.adapters - DEBUG - Decrypting and yielding decrypted block: (1)
2014-07-01 12:24:13,183 - pprp.source - DEBUG - Yielding [data] source block: (2)-(32)
2014-07-01 12:24:13,183 - pprp.adapters - DEBUG - Encrypting and yielding encrypted block: (2)
2014-07-01 12:24:13,183 - pprp.adapters - DEBUG - Decrypting and yielding decrypted block: (2)
2014-07-01 12:24:13,184 - pprp.source - DEBUG - Yielding [data] source block: (3)-(48)
2014-07-01 12:24:13,184 - pprp.adapters - DEBUG - Encrypting and yielding encrypted block: (3)
2014-07-01 12:24:13,184 - pprp.adapters - DEBUG - Decrypting and yielding decrypted block: (3)
...

Notes

The generators can take a block-size in the event that you don’t want the default. The default block-size can also be changed via the PPRP_BLOCK_SIZE environment variable.

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

pprp-0.2.3.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

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

pprp-0.2.3-py2-none-any.whl (20.9 kB view details)

Uploaded Python 2

File details

Details for the file pprp-0.2.3.tar.gz.

File metadata

  • Download URL: pprp-0.2.3.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pprp-0.2.3.tar.gz
Algorithm Hash digest
SHA256 f0bf789b766937f64127eeadb1948dd144764c1b7886652118c6e3fa7cb32751
MD5 932a0168006aae9aa51c24205f62ba3f
BLAKE2b-256 fc7348fc21b2ec27735452677fd9341ae430ae95b5f169d7d319afbc17e8746a

See more details on using hashes here.

File details

Details for the file pprp-0.2.3-py2-none-any.whl.

File metadata

  • Download URL: pprp-0.2.3-py2-none-any.whl
  • Upload date:
  • Size: 20.9 kB
  • Tags: Python 2
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pprp-0.2.3-py2-none-any.whl
Algorithm Hash digest
SHA256 413522f7d42802250efd14f5bd26baab56e4b79da302b1678e47d005bd949167
MD5 aa11b65f524088bcb0631f10ceb4be6b
BLAKE2b-256 4c9094ac1508726a8c1ac3c9f79f9937f53704afd04d693eeb26698f3b252113

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