Adding custom ciphers to pyCrypto using Cipher modes from pyCrypto

A python module for adding custom ciphers to pyCrypto.

In GSMK’s software, as a way of future proofing our ciphers, we XOR the result of two ciphers togehter:

Tandem(x) = AES(x) ^ Twofish(x)

Where AES and Twofish are each initialized with a different key.

Now I wanted to use the PyCrypto library as a basis for implementing some of our algorithms. Since Tandem cipher is not something supported by PyCrypto, I would need to add my own cipher, with a interface compatible with pyCrypto's. The problem I found is that in order to use the more complex ciphering modes found in pyCrypto you need to provide PyCrypto with a cipher which already supports several of the more basic ciphering modes.

The advanced modes implemented in Crypto/Cipher/blockalgo.py are these: MODE_CCM MODE_OPENPGP MODE_EAX MODE_SIV MODE_GCM

These are building upon the simple modes implemented by block_template.c: MODE_CTR MODE_CBC MODE_ECB MODE_CFB MODE_OFB and MODE_PGP ( no longer supported by PyCrypto )

So I wrote a base class which adds the simple modes to a cipher providing only the encrypt_block and decrypt_block methods.

The module can be found at: https://github.com/nlitsme/pyCryptoAdapter.

Testing

For the puprpose of testing _BlockCipher, I wrote an AES adapter using my _BlockCipher base class, and several wrapper objects implementing the various basic modes.

Now testing involves comparing the results of the wrapper objects against the original AES with MODE_xxx. This is done in test_consistency.py