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