I have coded Rail Fence Cipher in Python. I was wondering if there could be a better solution.
For those who don't know what rail fence cipher is, it is basically a method of writing plain text in a way it creates linear pattern in a spiral way. Example - when "FOOBARBAZ" rail-fenced using key of 3.
F . . . A . . . Z . . .
. O . B . R . A . Q . X
. . O . . . B . . . U .
Reading the above spiral line-by-line, the cipher text becomes "FAZOBRAQXOBU". Read more at - Rail fence - Wikipedia.
def cipher(s, key, graph=False) :
down=True
raw_out=[]
out=''
i=0
for x in range(key) :
raw_out.append({})
for pos in range(len(s)) :
raw_out[i][pos]=s[pos]
if i==key-1 :
down=False
if i==0 :
down=True
if down :
i=i+1
else :
i=i-1
for p in raw_out :
for q in p :
out+=p[q]
if graph :
return raw_out
return out
def decipher(s, key) :
map_list=cipher(s, key, True) #CREATING JUST FOR MAPPING - WHICHth CHARACTER OF THE STRING - IS WHICHth CHARACTER OF THE CIPHER
new={}
out=''
s_counter=0
for x in map_list :
for y in x :
new[y]=s[s_counter]
s_counter+=1
for p in new :
out+=new[p]
return map_list
I was wondering if there was any better way of doing this, since my procedure is very costly, it a uses couple of dictionaries.
Code in any language is welcomed.
Limitations of Rail Fence Technique It simply allows mixing up of characters in plain text to form the cipher text, it offers essentially no communication security and will be shown that it can be easily broken.
The Rail Fence Cipher was invented in ancient times. It was used by the Greeks, who created a special tool, called scytale, to make message encryption and decryption easier.
Therefore, when we go to encrypt “HELLO WORLD” via a rail cipher, it will become “HOL ELWRD LO”!
Just for the heck of it...
def fence(lst, numrails):
fence = [[None] * len(lst) for n in range(numrails)]
rails = range(numrails - 1) + range(numrails - 1, 0, -1)
for n, x in enumerate(lst):
fence[rails[n % len(rails)]][n] = x
if 0: # debug
for rail in fence:
print ''.join('.' if c is None else str(c) for c in rail)
return [c for rail in fence for c in rail if c is not None]
def encode(text, n):
return ''.join(fence(text, n))
def decode(text, n):
rng = range(len(text))
pos = fence(rng, n)
return ''.join(text[pos.index(n)] for n in rng)
z = encode('ATTACK.AT.DAWN', 3)
print z # ACTWTAKA.ANT.D
y = decode(z, 3)
print y # ATTACK.AT.DAWN
See an explanation at my blog.
(define (waves str h)
(define (down str)
(if (>= h (length str))
(list (fill h str))
(cons (take h str) (up (drop h str)))))
(define (up str)
(if (>= (- h 2) (length str))
(list (pad (fill (- h 2) str)))
(cons (pad (take (- h 2) str)) (down (drop (- h 2) str)))))
(define (pad str) (append (list X) (reverse str) (list X)))
(define (fill h str) (append str (make-list (- h (length str)) X)))
(down str))
(define (fence lox h)
(define a (apply append (transpose (waves lox h))))
(filter (lambda (e) (not (eq? X e))) a))
(define (encipher str h)
(list->string (fence (string->list str) h)))
(define (decipher str h)
(define e (fence (range (string-length str)) h))
(define x (map list e (string->list str)))
(define y (sort (lambda (i j) (<= (car i) (car j))) x))
(define z (map cadr y))
(list->string z))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With