index

pydecodr

pydecodr

A modular CTF/crypto library toolkit for encodings, classic ciphers, and autodetection. CLI included

pydecodr is a Python package that lets you encode, decode, encrypt or decrypt text using classical, polyalphabetic, modern, and stream ciphers, all through a Python API and a CLI interface


Features:

  • classical ciphers: (caesar, atbash, affine, rot13, substitution)
  • polyalphabetic: (vigenere, autokey_vigenere, beaufort, playfair)
  • fractionation: (bifid, ADFGX)
  • transpos9ition: (railfence, columnar)
  • stream: (xor, repeating xor, rc4)
  • modern: (aes, rsa, hash utilities)
  • encodings: (b32, b64, hex, URL-safe)
  • detection & utils: (file magic detection, I/O helpers)
  • cli interface

Installation

pip install pydecodr

Usage

CLI interface

You can use any cipher module directly with Python’s -m flag:

# caesar cipher
python3 -m pydecodr.ciphers.classical.caesar encrypt "HELLO" 3
# -> KHOOR

python3 -m pydecodr.ciphers.classical.caesar decrypt "KHOOR" 3
# -> HELLO

Python API

from pydecodr.ciphers.classical import caesar
from pydecodr.ciphers.polyalphabetic import vigenere

print(caesar.encrypt("HELLO", 3))
# KHOOR

print(vigenere.encrypt("HELLOWORLD", "KEY"))
# RIJVSUYVJN

Or load dynamically using the global registry:

from pydecodr import load_module

mod = load_module("adfgx")
ciphertext = mod.encrypt("DEFEND THE EAST WALL", "FORTIFICATION", "CIPHER")
print(mod.decrypt(ciphertext, "FORTIFICATION", "CIPHER"))

pydecodr CLI & code usage reference

This document shows how to use each cipher and module from the command line and from Python code.


classical ciphers

affine

CLI:

python3 -m pydecodr.ciphers.classical.affine encrypt <text> [a] [b]
python3 -m pydecodr.ciphers.classical.affine decrypt <text> [a] [b]
python3 -m pydecodr.ciphers.classical.affine crack <ciphertext>

Python:

from pydecodr.ciphers.classical.affine import encrypt, decrypt, crack
cipher = encrypt("HELLO", a=5, b=8)
plain = decrypt(cipher, a=5, b=8)
guesses = crack(cipher)

atbash

CLI:

python3 -m pydecodr.ciphers.classical.atbash <encode|decode> <text>

Python:

from pydecodr.ciphers.classical.atbash import encode, decode
cipher = encode("HELLO")
plain = decode(cipher)

caesar

CLI:

python3 -m pydecodr.ciphers.classical.caesar encrypt <text> [shift]
python3 -m pydecodr.ciphers.classical.caesar decrypt <text> [shift]
python3 -m pydecodr.ciphers.classical.caesar crack <text>

Python:

from pydecodr.ciphers.classical.caesar import encrypt, decrypt, crack
cipher = encrypt("HELLO", shift=3)
plain = decrypt(cipher, shift=3)
possible = crack(cipher)

rot13

CLI:

python3 -m pydecodr.ciphers.classical.rot13 <encode|decode> <text>

Python:

from pydecodr.ciphers.classical.rot13 import encode, decode
cipher = encode("HELLO")
plain = decode(cipher)

substitution

CLI:

python3 -m pydecodr.ciphers.classical.substitution generate-key
python3 -m pydecodr.ciphers.classical.substitution encrypt <text> <key>
python3 -m pydecodr.ciphers.classical.substitution decrypt <text> <key>

Python:

from pydecodr.ciphers.classical.substitution import generate_key, encrypt, decrypt
key = generate_key()
cipher = encrypt("HELLO", key)
plain = decrypt(cipher, key)

fractionation ciphers

adfgx

CLI:

python3 -m pydecodr.ciphers.fractionation.adfgx encrypt <text> <square_key> <trans_key> [pad]
python3 -m pydecodr.ciphers.fractionation.adfgx decrypt <text> <square_key> <trans_key> [pad]

Python:

from pydecodr.ciphers.fractionation.adfgx import encrypt, decrypt
cipher = encrypt("DEFEND THE CASTLE", "FORTIFICATION", "CIPHER", pad="X")
plain = decrypt(cipher, "FORTIFICATION", "CIPHER", pad="X")

bifid

CLI:

python3 -m pydecodr.ciphers.fractionation.bifid encrypt <text> [key] [period]
python3 -m pydecodr.ciphers.fractionation.bifid decrypt <text> [key] [period]

Python:

from pydecodr.ciphers.fractionation.bifid import encrypt, decrypt
cipher = encrypt("HELLO", key="KEYWORD", period=5)
plain = decrypt(cipher, key="KEYWORD", period=5)

modern ciphers

aes

CLI:

python3 -m pydecodr.ciphers.modern.aes encrypt <text> <key>
python3 -m pydecodr.ciphers.modern.aes decrypt <base64_iv_plus_ct> <key>

Python:

from pydecodr.ciphers.modern.aes import encrypt, decrypt
cipher = encrypt("HELLO WORLD", "mysecretkey123")
plain = decrypt(cipher, "mysecretkey123")

hashes

CLI:

python3 -m pydecodr.ciphers.modern.hashes hash <text> [algo]
python3 -m pydecodr.ciphers.modern.hashes verify <text> <digest>

Python:

from pydecodr.ciphers.modern.hashes import hash_text, verify
digest = hash_text("HELLO", algo="sha256")
valid = verify("HELLO", digest)

rsa

CLI:

python3 -m pydecodr.ciphers.modern.rsa gen <p> <q> [e]
python3 -m pydecodr.ciphers.modern.rsa encrypt <text> <n> <e>
python3 -m pydecodr.ciphers.modern.rsa decrypt <cipher> <n> <d>

Python:

from pydecodr.ciphers.modern.rsa import gen_keys, encrypt, decrypt
n, e, d = gen_keys(61, 53)
cipher = encrypt("HELLO", n, e)
plain = decrypt(cipher, n, d)

polyalphabetic ciphers

autokey vigenere

CLI:

python3 -m pydecodr.ciphers.polyalphabetic.autokey_vigenere encrypt <text> <key>
python3 -m pydecodr.ciphers.polyalphabetic.autokey_vigenere decrypt <text> <key>

Python:

from pydecodr.ciphers.polyalphabetic.autokey_vigenere import encrypt, decrypt
cipher = encrypt("HELLO", "KEY")
plain = decrypt(cipher, "KEY")

beaufort

CLI:

python3 -m pydecodr.ciphers.polyalphabetic.beaufort encrypt <text> <key>
python3 -m pydecodr.ciphers.polyalphabetic.beaufort decrypt <text> <key>

Python:

from pydecodr.ciphers.polyalphabetic.beaufort import encrypt, decrypt
cipher = encrypt("HELLO", "KEY")
plain = decrypt(cipher, "KEY")

playfair

CLI:

python3 -m pydecodr.ciphers.polyalphabetic.playfair encrypt <text> <key>
python3 -m pydecodr.ciphers.polyalphabetic.playfair decrypt <text> <key>

Python:

from pydecodr.ciphers.polyalphabetic.playfair import encrypt, decrypt
cipher = encrypt("HELLO", "SECRET")
plain = decrypt(cipher, "SECRET")

vigenere

CLI:

python3 -m pydecodr.ciphers.polyalphabetic.vigenere encrypt <text> <key>
python3 -m pydecodr.ciphers.polyalphabetic.vigenere decrypt <text> <key>

Python:

from pydecodr.ciphers.polyalphabetic.vigenere import encrypt, decrypt
cipher = encrypt("HELLO", "KEY")
plain = decrypt(cipher, "KEY")

rotor cipher

enigma

CLI:

python3 -m pydecodr.ciphers.rotor.enigma encrypt <text>
python3 -m pydecodr.ciphers.rotor.enigma decrypt <text>

Python:

from pydecodr.ciphers.rotor.enigma import encrypt, decrypt
cipher = encrypt("HELLO")
plain = decrypt(cipher)

stream ciphers

rc4

CLI:

python3 -m pydecodr.ciphers.stream.rc4 encrypt <text> <key> <encoding>
python3 -m pydecodr.ciphers.stream.rc4 decrypt <hex> <key> <encoding>

Python:

from pydecodr.ciphers.stream.rc4 import encrypt, decrypt
cipher = encrypt("HELLO", "KEY", encoding="hex")
plain = decrypt(cipher, "KEY", encoding="hex")

repeating xor

CLI:

python3 -m pydecodr.ciphers.stream.repeating_xor encrypt <text> <key> <encoding>
python3 -m pydecodr.ciphers.stream.repeating_xor decrypt <hex> <key> <encoding>

Python:

from pydecodr.ciphers.stream.repeating_xor import encrypt, decrypt
cipher = encrypt("HELLO", "KEY", "hex")
plain = decrypt(cipher, "KEY", "hex")

xor

CLI:

python3 -m pydecodr.ciphers.stream.xor encrypt <text> <key> <encoding>
python3 -m pydecodr.ciphers.stream.xor decrypt <hex> <key> <encoding>

Python:

from pydecodr.ciphers.stream.xor import encrypt, decrypt
cipher = encrypt("HELLO", "KEY", "hex")
plain = decrypt(cipher, "KEY", "hex")

transposition ciphers

columnar

CLI:

python3 -m pydecodr.ciphers.transposition.columnar encrypt <text> <key> [pad]
python3 -m pydecodr.ciphers.transposition.columnar decrypt <text> <key> [pad]

Python:

from pydecodr.ciphers.transposition.columnar import encrypt, decrypt
cipher = encrypt("HELLO WORLD", "KEY", pad="X")
plain = decrypt(cipher, "KEY", pad="X")

railfence

CLI:

python3 -m pydecodr.ciphers.transposition.railfence encrypt <text> [rails]
python3 -m pydecodr.ciphers.transposition.railfence decrypt <text> [rails]

Python:

from pydecodr.ciphers.transposition.railfence import encrypt, decrypt
cipher = encrypt("HELLO", rails=3)
plain = decrypt(cipher, rails=3)

detectors

autodetect

CLI:

python3 -m pydecodr.detectors.autodetect <string>

Python:

from pydecodr.detectors.autodetect import detect
result = detect("SOMECIPHERTEXT")

file magic

CLI:

python3 -m pydecodr.detectors.file_magic <file>

Python:

from pydecodr.detectors.file_magic import detect_file
filetype = detect_file("mystery.bin")

encodings

base32

CLI:

python3 -m pydecodr.encodings.base32_mod <encode|decode> <text>

Python:

from pydecodr.encodings.base32_mod import encode, decode
encoded = encode("HELLO")
decoded = decode(encoded)

base64

CLI:

python3 -m pydecodr.encodings.base64_mod <encode|decode> <text>

Python:

from pydecodr.encodings.base64_mod import encode, decode
encoded = encode("HELLO")
decoded = decode(encoded)

hex

CLI:

python3 -m pydecodr.encodings.hex_mod <encode|decode> <text>

Python:

from pydecodr.encodings.hex_mod import encode, decode
encoded = encode("HELLO")
decoded = decode(encoded)

url

CLI:

python3 -m pydecodr.encodings.url_mod <encode|decode> <text>

Python:

from pydecodr.encodings.url_mod import encode, decode
encoded = encode("HELLO WORLD")
decoded = decode(encoded)

module map

ENCODING_MAP = {
    "base64": "pydecodr.encodings.base64_mod",
    "base32": "pydecodr.encodings.base32_mod",
    "hex": "pydecodr.encodings.hex_mod",
    "url": "pydecodr.encodings.url_mod",

    "caesar": "pydecodr.ciphers.classical.caesar",
    "atbash": "pydecodr.ciphers.classical.atbash",
    "affine": "pydecodr.ciphers.classical.affine",
    "rot13": "pydecodr.ciphers.classical.rot13",
    "substitution": "pydecodr.ciphers.classical.substitution",

    "vigenere": "pydecodr.ciphers.polyalphabetic.vigenere",
    "autokey_vigenere": "pydecodr.ciphers.polyalphabetic.autokey_vigenere",
    "beaufort": "pydecodr.ciphers.polyalphabetic.beaufort",
    "playfair": "pydecodr.ciphers.polyalphabetic.playfair",

    "bifid": "pydecodr.ciphers.fractionation.bifid",
    "adfgx": "pydecodr.ciphers.fractionation.adfgx",

    "railfence": "pydecodr.ciphers.transposition.railfence",
    "columnar": "pydecodr.ciphers.transposition.columnar",

    "xor": "pydecodr.ciphers.stream.xor",
    "repeating_xor": "pydecodr.ciphers.stream.repeating_xor",
    "rc4": "pydecodr.ciphers.stream.rc4",

    "enigma": "pydecodr.ciphers.rotor.enigma",

    "aes": "pydecodr.ciphers.modern.aes",
    "rsa": "pydecodr.ciphers.modern.rsa",
    "hashes": "pydecodr.ciphers.modern.hashes",

    "fmt": "pydecodr.utils.fmt",
    "ioutils": "pydecodr.utils.ioutils"
}