Difference between revisions of "PyCryptoPlus"
Jump to navigation
Jump to search
(3 intermediate revisions by 2 users not shown) | |||
Line 4: | Line 4: | ||
This is a development done by Christophe Oosterlynck under my supervision during his thesis work & internship at NXP. |
This is a development done by Christophe Oosterlynck under my supervision during his thesis work & internship at NXP. |
||
− | The code is available [http://repo.or.cz/w/python-cryptoplus.git |
+ | The code is available [http://repo.or.cz/w/python-cryptoplus.git on repo.or.cz] and [https://github.com/doegox/python-cryptoplus on github], which may be easier if you wan to submit pull requests. |
=== Differences with pycrypto === |
=== Differences with pycrypto === |
||
Line 71: | Line 71: | ||
| ANSI X.923 || Py || |
| ANSI X.923 || Py || |
||
|- style="background-color:#dddddd;" |
|- style="background-color:#dddddd;" |
||
− | ! align="left" colspan="8"| |
+ | ! align="left" colspan="8"|One-way Functions |
− | One-way Functions |
||
|- |
|- |
||
| MD5 || Py || C |
| MD5 || Py || C |
||
Line 107: | Line 106: | ||
|-style="background-color:#dddddd;" |
|-style="background-color:#dddddd;" |
||
! align="left" colspan="2"| root of CryptoPlus package |
! align="left" colspan="2"| root of CryptoPlus package |
||
⚫ | |||
⚫ | |||
− | |make all Crypto.Hash modules available under CryptoPlus.Hash |
||
|- |
|- |
||
|src/Protocol.py |
|src/Protocol.py |
||
Line 248: | Line 244: | ||
* own implementation |
* own implementation |
||
* based on documentation here: http://www.crypto.ruhr-uni-bochum.de/en_publications.html |
* based on documentation here: http://www.crypto.ruhr-uni-bochum.de/en_publications.html |
||
+ | |-style="background-color:#dddddd;" |
||
+ | ! align="left" colspan="2"| CryptoPlus.Hash subpackage |
||
⚫ | |||
+ | |src/Hash/__init__.py |
||
+ | |specify all the ciphers in the CryptoPlus.Hash package (new implementations and imports from pycrypto |
||
+ | |- |
||
+ | |src/Hash/python_*.py |
||
+ | | |
||
+ | * wrappers for the pure python (py*.py) implementations of hash functions |
||
+ | * provide "new()" function and some doctests |
||
+ | |- |
||
⚫ | |||
+ | | |
||
+ | *pure python implementations of hash functions |
||
+ | *pyradiogatun.py is own code, the rest is gathered from other sources |
||
|-style="background-color:#dddddd;" |
|-style="background-color:#dddddd;" |
||
! align="left" colspan="2"| CryptoPlus.Random subpackage (only used if pycrypto version > 2.0.1) |
! align="left" colspan="2"| CryptoPlus.Random subpackage (only used if pycrypto version > 2.0.1) |
Latest revision as of 22:46, 21 March 2014
Back to SAGE & cryptology
Info
Author & Download
This is a development done by Christophe Oosterlynck under my supervision during his thesis work & internship at NXP.
The code is available on repo.or.cz and on github, which may be easier if you wan to submit pull requests.
Differences with pycrypto
CryptoPlus | PyCrypto | ||||||
Block Ciphers | |||||||
---|---|---|---|---|---|---|---|
Block cipher algorithms | |||||||
Serpent | Py | ||||||
Blowfish | Py | C | |||||
Twofish | Py | ||||||
Idea | C | ||||||
DES | Py | C | |||||
3DES | Py | C | |||||
AES | Py | C | |||||
Rijndael | Py | ||||||
Present | Py | ||||||
Modes of operation | |||||||
CMAC | Py | ||||||
XCBC | |||||||
CBC-MAC | |||||||
CCM | |||||||
GCM | |||||||
ECB | Py | C | |||||
CBC | Py | C | |||||
CTR | Py | C | |||||
LRW | |||||||
XTS | Py | ||||||
MDC-2 | |||||||
Paddings | |||||||
bit padding | Py | ||||||
zeros | Py | ||||||
PKCS7 | Py | ||||||
PKCS12 | Py | ||||||
ISO 10126 | Py | ||||||
ANSI X.923 | Py | ||||||
One-way Functions | |||||||
MD5 | Py | C | |||||
SHA Family | Py (SHA1 & SHA2 family) | C (SHA-1 & 256) | |||||
Whirlpool | Py | ||||||
RipeMD | Py | Py | |||||
RadioGatun | Py | ||||||
HMAC | Py | Py | |||||
PBKDF2 | Py |
- ciphers from pycrypto are being used with the python chaining modes and not the original pycrypto ones
=> plaintext can be supplied in arbitrary sizes instead of multiples of the blocksize like in pycrypto: the new chaining modes keep a cache to encrypt/decrypt data once the cachesize holds at least a blocksize of data - new possibilities:
- Rijndael, Serpent, Twofish
- Rijndael is limited to blocksizes of 128, 192 and 256 bits
- CMAC, XTS, CTR
- XTS is usable for ciphers with blocksizes of 16 bytes => XTS-AES, Serpent, Twofish
- XTS encrypts the given input at once while all other chain modes encrypt only when a block plaintext is available in the cache
- CMAC is usable for blocksizes of 8 and 16 bytes
- OFB,CFB and CTR can be accessed as a stream cipher (you get the encrypted message immediately, you don't have to wait until a complete block of plaintext has been provided to the cipher)
- new Hash functions: extended SHA family, Whirpool, RadioGatùn, PBKDF2
- Rijndael, Serpent, Twofish
- test functions are available via doctests and extensive tests that loop through dictionary of test vectors
- new pycrypto version will have it's own test bench for ciphers, this is not implemented yet
source structure
root of CryptoPlus package | |
---|---|
src/Protocol.py | make all Crypto.Protocol modules available under CryptoPlus.Protocol |
src/PublicKey.py | make all Crypto.PublicKey modules available under CryptoPlus.PublicKey |
src/__init__.py | make the following modules available under the CryptoPlus package:
|
src/testvectors.py |
|
CryptoPlus.Cipher subpackage | |
src/Cipher/__init__.py | specify all the ciphers in the CryptoPlus.Cipher package + import of the streamcipher ARC4 and XOR |
src/Cipher/blockcipher.py |
|
Wrappers for pycrypto | |
src/Cipher/AES.py |
|
src/Cipher/ARC2.py |
|
src/Cipher/Blowfish.py |
|
src/Cipher/CAST.py |
|
src/Cipher/DES.py |
|
src/Cipher/DES3.py |
|
src/Cipher/IDEA.py |
|
src/Cipher/RC5.py |
|
Wrappers for pure python implementations | |
src/Cipher/python_AES.py |
|
src/Cipher/python_Blowfish.py |
|
src/Cipher/python_DES.py |
|
src/Cipher/python_DES3.py |
|
src/Cipher/python_Rijndael.py |
|
src/Cipher/python_Serpent.py |
|
src/Cipher/python_Twofish.py |
|
src/Cipher/python_PRESENT.py |
|
Pure python implementations for blockciphers | |
src/Cipher/pyDes.py |
|
src/Cipher/pyblowfish.py |
|
src/Cipher/pyserpent.py |
|
src/Cipher/pytwofish.py |
|
src/Cipher/rijndael.py |
|
src/Cipher/pypresent.py |
|
CryptoPlus.Hash subpackage | |
src/Hash/__init__.py | specify all the ciphers in the CryptoPlus.Hash package (new implementations and imports from pycrypto |
src/Hash/python_*.py |
|
src/Hash/py*.py |
|
CryptoPlus.Random subpackage (only used if pycrypto version > 2.0.1) | |
src/Util/__init__.py |
|
src/Util/Fortuna.py |
|
src/Util/OSRNG.py |
|
CryptoPlus.Util subpackage | |
src/Util/__init__.py |
|
src/Util/number.py src/Util/randpool.py src/Util/RFC1751.py |
|
src/Util/python_compat.py |
|
src/Util/padding.py |
|
src/Util/util.py |
|
Test scripts | |
test/test.py | runs extensive test with verified test vectors for: CBC, CFB, OFB and CTR with AES, DES,TDES2/3, Serpent128/192/256, CMAC-AES128/192/256, CMAC-TDES2/3, XTS-AES, PRESENT (80 and 128 bit key), Twofish (128/192/256bits keys) |
test/test_doctests.py | script to run all doctest available in every cipher wrapper (pure python and pycrypto wrapper) |
TODO
- check other implementation of Blowfish
- use unittest for test functions
- check development of pycrypto:
- Util.Counter & Util._counter
- SelfTest: usable to perform the test for python algo's in CryptoPlus if testvectors are in right format?
Licenses
Used by others
- used from python truecrypt implementation
all original code is under MIT license (much freedom according to [1])- pyTwofish (untouched)
python truecrypt author isn't the original author = > extra copyright notice that should be left in place - pyserpent (untouched)
python truecrypt author isn't the original author = > extra copyright notice that should be left in place - XTS (modified)
python truecrypt author is the original author => only MIT License - GF2n.py(untouched)
python truecrypt author is the original author => only MIT License
- pyTwofish (untouched)
- pyblowfish (untouched)
gpl or artistic license
To not affect the rest of the distribution we've to redistribute it only under Artistic license terms - rijndael.py (untouched)
using tls lite (public domain) implementation which uses code from Bram Cohen (public domain) - pyDes (untouched)
public domain according to its homepage - blockciphers CBC, ECB, CTR from [2] (modified)
keep copyright notice in place? - CMAC: omac.py
GPL but not really used it, just used as a starting point
Used in CryptoPlus
- pypresent.py
- MIT license
Cipher module
Test Vectors
- Collection of test vectors for a broad group of ciphers
- AES, DES, 3DES: http://csrc.nist.gov/groups/STM/cavp/standards.html
- AES in CBC, CTR, OFB, CFB: html version of pdf
- CMAC test vectors in Special Publication 800-38B are faulty, use the corrected ones from here
- Rijndael: http://fp.gladman.plus.com/cryptography_technology/rijndael/
- zip file contains a full set of round values for each of the 25 block and key length combinations from 128, 160, 192, 224 and 256 bits for one input block and one key value
- DES (enkel ECB): http://www.skepticfiles.org/faq/testdes.htm
- Blowfish: http://www.schneier.com/code/vectors.txt
- Serpent: http://www.cs.technion.ac.il/~biham/Reports/Serpent/
- Twofish: http://www.schneier.com/code/ecb_ival.txt
- AES, DES: http://svn.python.org/projects/external/openssl-0.9.8a/test/evptests.txt
- CMAC
- AES & TDES: http://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html
- AES, TDES2 & TDES3: http://csrc.nist.gov/groups/STM/cavp/documents/mac/cmactestvectors.zip
- fax folder contains usefull stuff: generation and verification tests with results
generation test: generate a correct mac
verification test: verify if provided mac for plaintext is correct
- fax folder contains usefull stuff: generation and verification tests with results
- XTS-AES: IEEE P1619TM/D16: Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices
- ARC2: http://www.ietf.org/rfc/rfc2268.txt
- will be available in pycrypto >2.0.1
- CAST: http://www.rfc-editor.org/rfc/rfc2144.txt
Chaining Modes
- Wikipedia
- NIST
- XTS:
- https://siswg.net/index.php?option=com_content&task=view&id=38&Itemid=73
- http://blog.bjrn.se/2008/02/truecrypt-explained-truecrypt-5-update.html
- http://en.wikipedia.org/wiki/IEEE_P1619 = XTS-AES
- XTS-AES: IEEE P1619TM/D16: Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices
- Comments: [3]
- "It should be mentioned explicitly in the description that when enciphering many blocks, successive T values can and should be computed from prior ones via multiplication by alpha (providing that i remains fixed). This optimization, which is one of the best features of XEX, should be explicitly recommended in the standard."
- CMAC = OMAC1:
- AES-CMAC: http://tools.ietf.org/html/rfc4493#page-2
- NIST:
Recommendation for Block Cipher Modes of Operation: The CMAC Mode for Authentication:SP 800-38B.pdf
Updated CMAC Examples - OMAC.py: http://github.com/jlhutch/jac/tree/master/omac.py
- OMAC page: http://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html
Ciphers
- Serpent
- http://www.cl.cam.ac.uk/~rja14/serpent.html
- python implementation used
at the momentin earlier versions: http://psionicist.online.fr/code/ - alternative python implementation (used in current version): http://www.cl.cam.ac.uk/~fms27/serpent/
- more info on this python implementation: http://www.cl.cam.ac.uk/~fms27/serpent/serpent-abstract.html
- Present
- Article: PRESENT: An Ultra-Lightweight Block Cipher
- Test Vector generator + ANSI-C implementation of present: [4]
- own implementation
- ARC2
- http://www.ietf.org/rfc/rfc2268.txt: publication + testvectors
- current pycrypto implementation fails all testvectors because of not correctly handling the "effective keylength". Fixed in upcoming release (+2.0.1) bugreportbugfix
- CAST
- RC5
Hash Module
Current Situation
- MD5
- http://www.rfc-editor.org/rfc/rfc1321.txt
- good implementation in pypy (Python License)
- SHA family
- FIPS 180-2
- SHA1: http://www.rfc-editor.org/rfc/rfc3174.txt
- SHA-1 available in pypy (Python License)
- can be modified for other SHA's
- uses standard python hash api
- SHA-256 implementation: https://vcs.slash-me.net/snippets/sha256/sha256.py
- short code but less readable than the one from pypy
- SHA-224, 256, 384, and 512 at http://reikon.us/sha2/
- less readable than pypy implementation (pypy is using same structure for md5 and sha1)
- uses same API as standard python hashing modules
- MIT License
- Whirlpool
- Homepage
- available here: python truecrypt implementation
- RipeMD
- http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
- RipeMD-160 available as pure python implementation in current pycrypto development
=>RipeMD and python_RipeMD will point to the same pycrypto ripemd implementation - modify to add RipeMD-128?
- RadioGatun
- http://radiogatun.noekeon.org/
- reference C-code
- testvectors
- http://radiogatun.noekeon.org/
- HMAC
- available in python and pypy as pure python
-> same implementation used in pycrypto: no need to copy it again in cryptoplus?
- available in python and pypy as pure python
- PBKDF2
- implementation from new pycrypto developer: http://www.dlitz.net/software/python-pbkdf2/
- standard + testvectors: RFC 3962
Stream Ciphers
- SNOW2 / SNOW3G
- http://www.it.lth.se/cryptology/snow/
- Snow 3G
- www.gsmworld.com/using/algorithms/docs/snow_3g_spec.pdf
- "The main difference in SNOW 3G is the addition of a second S-box giving higher resistance against possible future advances in algebraic cryptanalysis"[5]
- LFSR, FSM, S-Box
- Grain
- http://www.ecrypt.eu.org/stream/grainpf.html
- LFSR, NFSR, output function
- Trivium
- LFSR
- (self)Shrinking Generator
- ARC4
- XOR