Skip to main content

Algorithm for solving simple, monoalphabetic substitution ciphers

Project description

Substitution Cipher Solver

Algorithm for solving simple, monoalphabetic substitution ciphers

This is Python implementation of the algorithm for solving simple, monoalphabetic substitution ciphers described in the paper “A Fast Method for the Cryptanalysis of Substitution Ciphers” by Thomas Jakobsen. The main difference from the paper is that random key swaps are used instead of a deterministic series of swaps since it yields better results, but the original method is included and can be used as an option.

Installing

pip install cipher_solver

API

class SimpleSolver:
    """Simple substitution cipher solver."""

    def __init__(self, ciphertext):
        """Create new solver.

        Creates a new cipher solver from an initial ciphertext.
        """

    def solve(self, method="random"):
        """Solve the cipher.

        Run the solver and save the resulting decryption key.
        """

    def plaintext(self):
        """Return a plaintext using the current decryption key."""

    def reset(self):
        """Reset the solver to its initial state.

        Set the decryption key to its initial state, effectively starting over.
        """

See the documentation for full description of methods and their parameters.

Requirements

  • numpy

Usage

from cipher_solver.simple import SimpleSolver

# Solve a cipher.
s = SimpleSolver("U kn kgmhksz tkm exmpb xt Gxesxe.")
s.solve()
print(s.plaintext())  # "I am already far north of London."

s.reset()  # Discard current solution to start over.
s.solve()
print(s.plaintext())  # We have an alternative solution now.

print(s.decryption_key())  # "goaskbihxvrldepfwntmzqjucy"

# Solve using the original key swap method instead.
d = SimpleSolver("U kn kgmhksz tkm exmpb xt Gxesxe.", method="deterministic")
d.solve()
print(s.plaintext())

Note, however, that the above ciphertext is too short to give any meaningful results. A length of at least a few hundred letters is preferred to solve a cipher. See below for an example using an included sample text.

CLI

A simple command-line interface is included. To solve a cipher, put it into a text file and run:

cipher_solver <path_to_ciphertext_file>

Example:

cipher_solver texts/26_char_key/ciphertexts/ciphertext_frankenstein_sample.txt

Since the algorithm involves hill climbing and randomness you might sometimes end up with complete gibberish, just run the script again and the next result should be better.

Running tests

make test

Checking coverage

make coverage

(Requires the coverage package.)

Generating documentation

make docs

(Requires the pdoc3 package.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cipher_solver-1.0.2.tar.gz (12.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cipher_solver-1.0.2-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file cipher_solver-1.0.2.tar.gz.

File metadata

  • Download URL: cipher_solver-1.0.2.tar.gz
  • Upload date:
  • Size: 12.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for cipher_solver-1.0.2.tar.gz
Algorithm Hash digest
SHA256 4c8dcf0ef96fab593394f8965705f4810d938d6a0e6537c2af20251c76781606
MD5 b2e5b020ad3d93811113f42dd75cb42b
BLAKE2b-256 6cbd39bb025690030ff5c9318ab4cef76aea3138d3211e95da7286ce438194bb

See more details on using hashes here.

File details

Details for the file cipher_solver-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: cipher_solver-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for cipher_solver-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b6419461356465c2f67ff8383156055f91bd6eead1020b684b1a201279b54cea
MD5 66e2a2043507a7b79ccd6b0a8405dd05
BLAKE2b-256 357ea549abe27dd8e696c8dd239b62dd2e18e87a9225a1353802c37c702cf7c6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page