Rail Fence Cipher-寻找更好的解决方案

Shu*_*hya 7 python encryption algorithm cryptography

我用Python编写了Rail Fence Cipher.我想知道是否有更好的解决方案.

对于那些不知道什么是铁栅栏密码的人来说,它基本上是一种以一种螺旋方式创建线性图案的方式编写纯文本的方法.示例 - 当"FOOBARBAZ"使用3的键进行轨道围栏时.

F . . . A . . . Z . . .
. O . B . R . A . Q . X
. . O . . . B . . . U .
Run Code Online (Sandbox Code Playgroud)

逐行读取上述螺旋,密文成为"FAZOBRAQXOBU".阅读更多 - 铁栅栏 - 维基百科.

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
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法,因为我的程序非常昂贵,它使用几个字典.

欢迎任何语言的代码.

geo*_*org 10

只是为了它...

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
Run Code Online (Sandbox Code Playgroud)