Classical ciphers
Project description
Download:
https://pypi.org/project/secretpy
Documentation:
https://secretpy.readthedocs.io
Source code & Development:
https://github.com/tigertv/secretpy
Description
SecretPy is a cryptographic Python package. It uses the following classical cipher algorithms:
Affine
Atbash
Bazeries
Beaufort
Caesar, Caesar Progressive
Chaocipher
Keyword
Playfair, Two Square(Double Playfair), Three Square, Four Square
Polybius, ADFGX, ADFGVX, Bifid, Trifid, Nihilist
Rot13, Rot5, Rot18, Rot47
Simple Substitution
Transposition: Columnar, Scytale, Spiral, Myszkowski, Zigzag(Railfence)
Vic
Vigenere, Autokey, Gronsfeld, Porta
Installation
To install this library, you can use pip:
pip install secretpy
Alternatively, you can install the package using the repo’s cloning and the make:
git clone https://github.com/tigertv/secretpy
cd secretpy
make install
Usage
Direct way
The cipher classes can encrypt only characters which exist in the alphabet, and they don’t have a state.
from secretpy import Caesar, alphabets as al
def encdec(cipher, plaintext, key, alphabet=al.ENGLISH):
print('========================================================================================')
print(plaintext)
enc = cipher.encrypt(plaintext, key, alphabet)
print(enc)
print(cipher.decrypt(enc, key, alphabet))
key = 3
cipher = Caesar()
plaintext = u"thequickbrownfoxjumpsoverthelazydog"
encdec(cipher, plaintext, key)
alphabet = al.GERMAN
plaintext = u"schweißgequältvomödentextzürnttypografjakob"
encdec(cipher, plaintext, key, alphabet)
alphabet = al.SWEDISH
plaintext = u"faqomschweizklövdutrångpjäxby"
encdec(cipher, plaintext, key, alphabet)
'''
Output:
========================================================================================
thequickbrownfoxjumpsoverthelazydog
wkhtxlfneurzqiramxpsvryhuwkhodcbgrj
thequickbrownfoxjumpsoverthelazydog
========================================================================================
schweißgequältvomödentextzürnttypografjakob
vfkzhlcjhtxßowyrpaghqwhäwübuqwwösrjudimdnre
schweißgequältvomödentextzürnttypografjakob
========================================================================================
faqomschweizklövdutrångpjäxby
idtrpvfkzhlönocygxwuaqjsmbåeä
faqomschweizklövdutrångpjäxby
'''
CryptMachine
CryptMachine saves a state. There are alphabet, key and cipher, they can be changed at anytime. In the previous example, plaintext contains only characters existing in the alphabet i.e. without spaces and etc. To change the behaviour, you can use CryptMachine and decorators(SaveAll, Block), so it’s a preferred way to do encryption/decryption:
from secretpy import Caesar, CryptMachine, alphabets as al
from secretpy.cmdecorators import SaveAll, Block
def encdec(machine, plaintext):
print("--------------------------------------------------------------------")
print(plaintext)
enc = machine.encrypt(plaintext)
print(enc)
print(machine.decrypt(enc))
key = 3
cipher = Caesar()
cm0 = CryptMachine(cipher, key)
cm = cm0
cm.set_alphabet(al.ENGLISH)
plaintext = "I don't love non-alphabet characters. I will remove all of them: ^,&@$~(*;?&#. Great!"
encdec(cm, plaintext)
cm = Block(cm, length=5, sep="-")
plaintext = "This text is divided by blocks of length 5!"
encdec(cm, plaintext)
cm = SaveAll(cm0)
plaintext = "I love non-alphabet characters. These are : ^,&@$~(*;?&#. That's it!"
encdec(cm, plaintext)
cm.set_alphabet(al.ENGLISH_SQUARE_IJ)
plaintext = "Jj becomes Ii because we use ENGLISH_SQUARE_IJ!"
encdec(cm, plaintext)
cm.set_alphabet(al.JAPANESE_HIRAGANA)
cm.set_key(1)
plaintext = u"text あい だやぎへぐゆぢ"
encdec(cm, plaintext)
'''
Output:
--------------------------------------------------------------------
I don't love non-alphabet characters. I will remove all of them: ^,&@$~(*;?&#. Great!
lgrqworyhqrqdoskdehwfkdudfwhuvlzloouhpryhdooriwkhpjuhdw
idontlovenonalphabetcharactersiwillremoveallofthemgreat
--------------------------------------------------------------------
This text is divided by blocks of length 5!
wklvw-hawlv-glylg-hgebe-orfnv-riohq-jwk
thistextisdividedbyblocksoflength
--------------------------------------------------------------------
I love non-alphabet characters. These are : ^,&@$~(*;?&#. That's it!
L oryh qrq-doskdehw fkdudfwhuv. Wkhvh duh : ^,&@$~(*;?&#. Wkdw'v lw!
I love non-alphabet characters. These are : ^,&@$~(*;?&#. That's it!
--------------------------------------------------------------------
Jj becomes Ii because we use ENGLISH_SQUARE_IJ!
Mm ehfrphv Mm ehfdxvh zh xvh HQKOMVL_VTXDUH_MM!
Ii becomes Ii because we use ENGLISH_SQUARE_II!
--------------------------------------------------------------------
text あい だやぎへぐゆぢ
text いう ぢゆぐほげよづ
text あい だやぎへぐゆぢ
'''
CompositeMachine
Combining several ciphers to get more complex cipher, you can use CompositeMachine:
from secretpy import Rot13, Caesar, CryptMachine, CompositeMachine
from secretpy.cmdecorators import SaveAll
def encdec(machine, plaintext):
print("=======================================")
print(plaintext)
enc = machine.encrypt(plaintext)
print(enc)
dec = machine.decrypt(enc)
print(dec)
key = 5
plaintext = u"Dog jumps four times and cat six times"
print(plaintext)
cm1 = SaveAll(CryptMachine(Caesar(), key))
enc = cm1.encrypt(plaintext)
print(enc)
cm2 = SaveAll(CryptMachine(Rot13()))
enc = cm2.encrypt(enc)
print(enc)
print("=======================================")
cm = CompositeMachine(cm1)
cm.add_machines(cm2)
enc = cm.encrypt(plaintext)
print(enc)
encdec(cm, plaintext)
cm.add_machines(cm1, cm2)
encdec(cm, plaintext)
'''
Output:
Dog jumps four times and cat six times
Itl ozrux ktzw ynrjx fsi hfy xnc ynrjx
Vgy bmehk xgmj laewk sfv usl kap laewk
=======================================
Vgy bmehk xgmj laewk sfv usl kap laewk
=======================================
Dog jumps four times and cat six times
Vgy bmehk xgmj laewk sfv usl kap laewk
Dog jumps four times and cat six times
=======================================
Dog jumps four times and cat six times
Nyq tewzc pyeb dswoc kxn mkd csh dswoc
Dog jumps four times and cat six times
'''
Maintainers
@tigertv (Max Vetrov)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file secretpy-0.12.0.tar.gz
.
File metadata
- Download URL: secretpy-0.12.0.tar.gz
- Upload date:
- Size: 17.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.15.0 pkginfo/1.6.1 requests/2.25.0 setuptools/44.1.1 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/2.7.17
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0352873662c28c95d1160f16a766e75a6424260e2374005b008cf53a14719cb9 |
|
MD5 | e54f3e523ca4d236fe77caabaaee5db2 |
|
BLAKE2b-256 | ff32f8077ae6f19df8b6553559c29a5f59e992f9f21f02d9043a5c7e7aa05f45 |
File details
Details for the file secretpy-0.12.0-py2.py3-none-any.whl
.
File metadata
- Download URL: secretpy-0.12.0-py2.py3-none-any.whl
- Upload date:
- Size: 41.1 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.15.0 pkginfo/1.6.1 requests/2.25.0 setuptools/44.1.1 requests-toolbelt/0.9.1 tqdm/4.54.0 CPython/2.7.17
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 08e1328d7731ba817c8acdf9be49243ce1985585a69ddbcdf22fdcc81005503c |
|
MD5 | 8074e0d590435eb8526440811f8d0821 |
|
BLAKE2b-256 | 5ce80a0382e224e61ef6d90bd1e7957fb924d1c79b68749dee0fef2b87496c5e |