2023-02-09 Columnar transposition A columnar transposition is simple transposition cypher which can be en-/decrypted by hand and was widely used during wartime. If the cyphertext is long (~200 characters) und the cypher is applied twice with different keys this encryption method is rather hard to break. Quoting Wikipedia[1]: In a columnar transposition, the message is written out in rows of a fixed length, and then read out again column by column, and the columns are chosen in some scrambled order. Both the width of the rows and the permutation of the columns are usually defined by a keyword. For example, the keyword UNCLETED is of length 8 (so the rows are of length 8), and the permutation is defined by the alphabetical order of the letters in the keyword. In this case, the order would be "8, 6, 1, 5, 3, 7, 4, 2". And now my simple elisp implementation using the thread-operator macro[2] (borrowed from Clojure). (require 'dash) (defun encrypt-columnar-transposition (input-str passphrase) (let ((key (-grade-down (lambda (a b) (string> a b)) (split-string (upcase passphrase) "" t))) (my/split (lambda (x) (split-string x "" t)))) (->> (upcase input-str) (replace-regexp-in-string "\\([ \t\r\n]+\\)" "") (funcall my/split) (-partition-all (length key)) (apply #'-pad "E")))) (-unzip) (-select-by-indices key) (-map #'string-join) (string-join)))) (encrypt-columnar-transposition "The Industrial Revolution and its consequences have been a disaster for the human race" "uncleted") => "EIUIQADFMESVANEETECENLISEESRNEUENOCESHAEIATTUVIOAEHRLDEHARUEDROCNBATRETTONSSNEHE" Nice. Encryption by hand ~~~~~~~~~~~~~~~~~~ THEINDUSTRIALREVOLUTIONANDITSCONSEQUENCESHAVEBEENADISASTERFORTHEHUMANRACE UNCLETED <--- keyword 86153742 <--- alphabetical order of the keyword |||||||| vvvvvvvv THEINDUS TRIALREV OLUTIONA NDITSCON SEQUENCE SHAVEBEE NADISAST ERFORTHE HUMANRAC EEEEEEEE <--- last line padded with E (most common character) C -> EIUIQADFMS D -> VANEETECNL E -> ISEESRNUEN E -> OCESHAIATT L -> UVIOAHRLDE N -> HARUDROCNB T -> ATRTTONSSN U -> EHE CIPHERTEXT: EIUIQADFMESVANEETECENLISEESRNEUENOCESHAEIATTUVIOAEHRLDEHARUEDROCNBATRETTONSSNEHE Footnotes ~~~~~~~~~ [1] https://en.wikipedia.org/wiki/Transposition_cipher#Columnar_transposition [2] https://github.com/magnars/dash.el#threading-macros-1