Python 对柱状转置密码进行加密

Python 对柱状转置密码进行加密,python,encryption,python-3.x,multiple-columns,transpose,Python,Encryption,Python 3.x,Multiple Columns,Transpose,我试图找出如何在给定一个明文大写字符串和任意长度的数字密钥的情况下,在Python中加密一个列转置密码。例如,如果键为3124,字符串为“IHAVETWOCATS”,则它将按如下方式组织字符串: 3124 IHAV ETWO CATS 然后首先返回第1列中的字符,然后返回第2列中的字符,以此类推,直到最后返回加密字符串'HTAAWTIECVOS'。到目前为止,我知道我需要使用累加器,我一直在考虑使用字典,但我完全被卡住了。以下是我尝试过的一些功能: def columnar(plaintext

我试图找出如何在给定一个明文大写字符串和任意长度的数字密钥的情况下,在Python中加密一个列转置密码。例如,如果键为3124,字符串为“IHAVETWOCATS”,则它将按如下方式组织字符串:

3124
IHAV
ETWO
CATS
然后首先返回第1列中的字符,然后返回第2列中的字符,以此类推,直到最后返回加密字符串
'HTAAWTIECVOS'
。到目前为止,我知道我需要使用累加器,我一直在考虑使用字典,但我完全被卡住了。以下是我尝试过的一些功能:

def columnar(plaintext,key):
    cipher=''
    acc=0
    for i in range(len(key)):
        while acc<(len(plaintext)/len(key)):
            cipher=cipher+plaintext[i+acc*5]
            acc=acc+1
    return(cipher)
def列(纯文本,键):
密码=“”
acc=0
对于范围内的i(len(key)):
而acc
split\u len
由伊恩·比金创作

因此,我使用
split\u len
将代码分割成块,然后使用字典理解来获得正确的索引顺序,最后按照该顺序将字母拼合

def encode(txt,key):
    sz = len(key)  # how big are the columns 
    cols = list(map("".join,zip(*zip(*[iter(txt)]*sz)))) # list partitioned into columns
    return "".join([cols[key.index(str(c))] for c in range(1,sz+1)])



encoded = encode("IHAVETWOCATS","3124")
print encoded

如果我读对了,我可能会这样做

,这个函数是硬连线的,只适用于键“3124”和纯文本“IHAVETWOCATS”。如何修改此函数以适应任何字符串和键?把它放在参数中?@hooliaqouolia:我已经编辑了代码并将其包装到函数中。只有当文本长度是键长度的乘积时,这才有效。用相同的文本和“31245”键尝试一下。我复制并粘贴了这个,但我得到了错误:“'map'对象不可订阅。”有没有办法将map对象从连接中移除?@aseeon是的,你是对的……我可以很容易地将它切换到izip_longest来解决这个问题,如果这是一个有效的senario…@hooliaqoulia为你修复了这个问题。。。。。在我的python版本中,map返回一个列表。。。但我忘记了在当前迭代中,它返回一个iterator@JoranBeasley非常感谢,这真的很有帮助!
def encode(txt,key):
    sz = len(key)  # how big are the columns 
    cols = list(map("".join,zip(*zip(*[iter(txt)]*sz)))) # list partitioned into columns
    return "".join([cols[key.index(str(c))] for c in range(1,sz+1)])



encoded = encode("IHAVETWOCATS","3124")
print encoded