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