【问题标题】:Encrypting a columnar transposition cipher加密列转置密码
【发布时间】:2014-07-21 18:44:01
【问题描述】:

我试图弄清楚如何在 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 columnar(plaintext,key) values={} seqlist=[] nextvalue=1 indices=rand(len(key)) for letter in plaintext: for i in indices: if letter==key[i]: values[i]=nextvalue nextvalue=nextvalue+1 for i in indices: seqlist.append(values[i]) return seqlist

^上面的函数返回一个 KeyError: 0 错误。 非常感谢您的帮助!

【问题讨论】:

    标签: python encryption python-3.x multiple-columns transpose


    【解决方案1】:
    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
    

    我可能会这样做

    【讨论】:

    • 这仅适用于文本长度是密钥长度的乘积。尝试使用相同的文本和“31245”键。
    • 我复制并粘贴了这个,但我得到了错误:“'map' object is not subscriptable。”有没有办法将地图对象从连接中取出?
    • @aseeon 是的,你是对的......我可以很容易地将它切换到 izip_longest 来解决这个问题,如果这是一个有效的 senario ..
    • @hooliaquoolia 为你修复了这个问题.....在我的 python 版本中 map 返回一个列表......但我忘记了在当前迭代中它返回一个迭代器
    • @JoranBeasley 非常感谢,这真的很有帮助!
    【解决方案2】:
    def split_len(seq, length):
        return [seq[i:i + length] for i in range(0, len(seq), length)]
    
    def encode(key, plaintext):
    
        order = {
            int(val): num for num, val in enumerate(key)
        }
    
        ciphertext = ''
        for index in sorted(order.keys()):
            for part in split_len(plaintext, len(key)):
                try:
                    ciphertext += part[order[index]]
                except IndexError:
                    continue
    
        return ciphertext
    
    print(encode('3214', 'IHAVETWOCATS'))
    #>>> HTAAWTIECVOS
    

    split_len 的作者是伊恩·比金

    所以我使用split_len 将代码分成块,然后使用字典理解来获得正确的索引顺序,最后我按该顺序连接字母。

    【讨论】:

    • 如果我没看错,这个函数是硬连线的,只适用于密钥“3124”和明文“IHAVETWOCATS”。我将如何修改此函数以适应任何字符串和任何键?放在参数里?
    • @hooliaquoolia:我已经编辑了代码并将其包装到函数中
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2011-06-30
    • 2018-01-20
    • 2017-07-24
    • 2020-11-25
    相关资源
    最近更新 更多