Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当轨道长度不同时,三个轨道解密_Python_Python 3.x - Fatal编程技术网

Python 当轨道长度不同时,三个轨道解密

Python 当轨道长度不同时,三个轨道解密,python,python-3.x,Python,Python 3.x,我在试图弄明白如何让我的解密函数工作时遇到了很多麻烦。它在msg可以被3整除的理想情况下工作,但是在那之后我就完全迷路了。我对我必须要做的事情有一个模糊的想法,因为我能够用两个rails来实现这一点,但是用三个rails有更多的可能性。我完全迷路了:(而且所有那些打印出来的声明都只是为了帮助我弄清楚到底发生了什么 import sys def main(): plaintext="abcdefgh" print(threeRailEncrypt(plaintext))

我在试图弄明白如何让我的解密函数工作时遇到了很多麻烦。它在msg可以被3整除的理想情况下工作,但是在那之后我就完全迷路了。我对我必须要做的事情有一个模糊的想法,因为我能够用两个rails来实现这一点,但是用三个rails有更多的可能性。我完全迷路了:(而且所有那些打印出来的声明都只是为了帮助我弄清楚到底发生了什么

import sys

def main():
    plaintext="abcdefgh"
    print(threeRailEncrypt(plaintext))
    print(threeRailDecrypt(threeRailEncrypt(plaintext)))


def threeRailEncrypt(plaintext):
    ciphertext=""
    rail1=""
    rail2=""
    rail3=""

    for i in range(len(plaintext)):
        if i%3 == 0:
            rail1=rail1+plaintext[i]
        elif i%3 == 1:
            rail2=rail2+plaintext[i]
        else:
            rail3=rail3+plaintext[i]

    ciphertext=rail1+rail2+rail3

    return(ciphertext)

def threeRailDecrypt(msg):
    if len(msg)%3==0:
        third=len(msg)//3
        print(third)
        rail1=msg[:third]
        rail2=msg[third:third*2]
        rail3=msg[third*2:]
        print(rail1,rail2,rail3)
        dm=""
        for i in range(third):
            dm=dm+rail1[i]
            dm=dm+rail2[i]
            dm=dm+rail3[i]
    else:
        third=(len(msg)//3)+1
        print(third)
        rail1=msg[:third]
        rail2=msg[third:third*2]
        rail3=msg[third*2:]
        print(rail1,rail2,rail3)
        dm=""
        for i in range(third):
            dm=dm+rail1[i]
            print(dm)
            dm=dm+rail2[i]
            print(dm)
            dm=dm+rail3[i]
            print(dm)
            if  len(rail2)>len(rail3):
                dm=dm+rail2[-1]
        return(dm)
main()
您可以使用跨步对字符串(或任何其他序列)进行切片;您可以使用该跨步选择每3个字符:

def threeRailEncrypt(plaintext):
    return plaintext[::3] + plaintext[1::3] + plaintext[2::3]
要扭转这种趋势,请将密文分为三个部分,然后使用重新组合:

from itertools import zip_longest, chain

def threeRailDecrypt(ciphertext):
    stride, remainder = divmod(len(ciphertext), 3)
    # how large was each of the three sections?
    sizes = [stride] * 3
    for i in range(remainder):
        sizes[i] += 1
    # slice ciphertext up into 3 sections again
    pos = 0
    pieces = []
    for s in sizes:
        pieces.append(ciphertext[pos:pos + s])
        pos += s
    # recombine the triplets
    return ''.join(chain.from_iterable(zip_longest(*pieces, fillvalue='')))
演示:

没有
zip\u最长的
的最后一部分是:

# recombine the triplets
plaintext = []
for i in range(len(parts[0])):
    for part in parts:
        try:
            plaintext.append(part[i])
        except IndexError:  # part too short
            pass
return ''.join(plaintext)

我还没有学习过izip,所以我认为我不能使用这种方法。@user2807779:另一种方法是循环
范围(len(片段[0])
,并将其作为3个片段的索引。^你能再解释一下吗?我如何获得片段?0值还有什么作用?@user2807779:查看更新;
片段[0]
是三个密文块中的第一个。第二个方法似乎也在使用我没有学过的命令,你知道其他方法吗?
# recombine the triplets
plaintext = []
for i in range(len(parts[0])):
    for part in parts:
        try:
            plaintext.append(part[i])
        except IndexError:  # part too short
            pass
return ''.join(plaintext)