Python中的换位密码

时间:2016-04-05 13:06:31

标签: python python-3.x cryptography

我目前正在尝试在python中编码转置密码。但是我已经达到了我陷入困境的程度。

我的代码:

key = "german"
length = len(key)
plaintext = "if your happy and you know it clap your hands, clap your hands"
Formatted = "".join(plaintext.split()).replace(",","")
split = split_text(formatted,length)

def split_text(formatted,length):
return [formatted[i:i + length] for i in range(0, len(formatted), length)]

def encrypt():

我使用它来计算字符串的长度,然后使用长度来确定在程序中创建的列数。所以它会创造这个:

GERMAN
IFYOUR
HAPPYA
NDYOUK
NOWITC
LAPYOU
RHANDS
CLAPYO
URHAND
S

这是知道我陷入困境的地方。因为我想让程序通过将列组合在一起来创建一个字符串。所以它会组合每一列来创建:

IHNNLRCUSFADOAHLRYPYWPAAH ..... 

我知道我需要某种循环但不确定如何告诉程序创建这样的字符串。

感谢

1 个答案:

答案 0 :(得分:1)

您可以使用字符串的切片以6(长度)

的步长获取字符串的每个字母
print(formatted[0::length])
#output:
ihnnlrcus

然后循环遍历range(length)中所有可能的起始索引并将它们全部链接在一起:

def encrypt(formatted,length):
    return "".join([formatted[i::length] for i in range(length)])

请注意,这实际上并未使用split_text,而是直接使用formatted

print(encrypt(formatted,length))

使用split_text的问题然后你不能使用像zip这样的工具,因为它们在第一个迭代器停止时停止(因为最后一个组只有一个字符,你只能得到它来自zip(*split))的一个小组

for i in zip("stuff that is important","a"):
    print(i)

#output:
("s","a")
#nothing else, since one of the iterators finished.

为了使用类似的东西你必须重新定义zip的工作方式,允许一些迭代器完成并继续直到所有这些完成:

def myzip(*iterators):
    iterators = tuple(iter(it) for it in iterators)
    while True: #broken when none of iterators still have items in them
        group = []
        for it in iterators:
            try:
                group.append(next(it))
            except StopIteration:
                pass
        if group:
            yield group
        else:
            return #none of the iterators still had items in them

然后您可以使用它来处理分割数据,如下所示:

encrypted_data = ''.join(''.join(x) for x in myzip(*split))