ciphers.columnar_transposition ============================== .. py:module:: ciphers.columnar_transposition .. autoapi-nested-parse:: Columnar Transposition cipher. This classical cipher writes the plaintext in rows under a keyword and reads columns in the order of the alphabetical rank of the keyword letters. Reference: https://en.wikipedia.org/wiki/Transposition_cipher#Columnar_transposition We keep spaces and punctuation. Key must be alphabetic (case-insensitive). >>> pt = "WE ARE DISCOVERED. FLEE AT ONCE" >>> ct = encrypt(pt, "ZEBRAS") >>> decrypt(ct, "ZEBRAS") == pt True Edge cases: >>> encrypt("HELLO", "A") 'HELLO' >>> decrypt("HELLO", "A") 'HELLO' >>> encrypt("HELLO", "HELLO") 'EHLLO' >>> decrypt("EHLLO", "HELLO") 'HELLO' >>> encrypt("HELLO", "") Traceback (most recent call last): ... ValueError: Key must be a non-empty alphabetic string Functions --------- .. autoapisummary:: ciphers.columnar_transposition._column_order ciphers.columnar_transposition._normalize_key ciphers.columnar_transposition.decrypt ciphers.columnar_transposition.encrypt Module Contents --------------- .. py:function:: _column_order(key: str) -> list[int] .. py:function:: _normalize_key(key: str) -> str .. py:function:: decrypt(ciphertext: str, key: str) -> str Decrypt columnar transposition ciphertext. :param ciphertext: Encrypted text :param key: Alphabetic keyword :return: Decrypted plaintext :raises ValueError: on invalid key .. py:function:: encrypt(plaintext: str, key: str) -> str Encrypt using columnar transposition. :param plaintext: Input text (any characters) :param key: Alphabetic keyword :return: Ciphertext :raises ValueError: on invalid key