ADFGX
August 7, 2009
It will be fairly simple to implement the ADFGX cipher because we can steal much code: string-upcase, string-index, range, zip and sort come from the Standard Prelude, and the transposition functions come from the exercise on Double Transposition. Only the conversion to-and-from the polybius square remains. Here’s encryption:
(define (to-adfgx key plain-text)
(define (p->c p)
(let ((x (string-index p key)))
(string
(string-ref "ADFGX" (quotient x 5))
(string-ref "ADFGX" (modulo x 5)))))
(apply string-append
(map p->c (map char-upcase
(string->list plain-text)))))
Instead of a square, we represent the key as a single string of twenty-five characters, and index into the string using the quotient
and modulo
functions. Decryption is almost as simple, but requires a map2
function to read the ciphertext string two letters at a time:
(define (from-adfgx key cipher-text)
(define (map2 f xs)
(if (or (null? xs) (null? (cdr xs))) '()
(cons (f (car xs) (cadr xs)) (map2 f (cddr xs)))))
(define (c->p c1 c2)
(string-ref key
(+ (* (string-index c1 "ADFGX") 5)
(string-index c2 "ADFGX"))))
(list->string
(map2 c->p (map char-upcase
(string->list cipher-text)))))
Then all that’s left is two wrapper functions that call the polybius square and transposition functions in the right order:
(define (encipher adfgx-key transpose-key plain-text)
(to-transpose transpose-key (to-adfgx adfgx-key plain-text)))
(define (decipher adfgx-key transpose-key cipher-text)
(from-adfgx adfgx-key (from-transpose transpose-key cipher-text)))
A sample dialog is shown below:
> (encipher "BTALPDHOZKQFVSNGICUXMREWY" "TULIP" "PROGRAMMINGPRAXIS")
DXAFXGGXAXDAFFDDXXXXAFAAGDGXGFGAAD
> (decipher "BTALPDHOZKQFVSNGICUXMREWY" "TULIP" "DXAFXGGXAXDAFFDDXXXXAFAAGDGXGFGAAD")
PROGRAMMINGPRAXIS
You can run the program at http://programmingpraxis.codepad.org/VwKUjLzk.
This is a exceptional blog, I located your blog browsing aol for a similar subject and arrived to this. I couldnt discover to much different material on this posting, so it was great to find this one. I definitely will end up being back to look at some other articles that you have another time.
Finally Done.
https://bitbucket.org/FalconShock/the-dyna-cryptosystem/src/3c795804e313dc2ebfdf70e1ddb7aee447f9c6f2/ADFGX.py?at=master