Python 栅栏密码

发布于 2021-12-25 22:45:56 字数 1823 浏览 866 评论 0

# -*- coding: utf-8 -*-

import math

# 明文
C = " h e l l o w o r l d "
# 一行几个单词
N = 3
# 密文
M = "hlodeorlwl"

def encode(C,N):
    """
    栅栏加密
    :param C: 明文
    """
    # 去除空格
    C = ''.join(C.split())
    # 计算能切分为几行
    sum = math.ceil(len(C) / N)
    # 遍历生成字典
    MList = {}
    tmpStart = 0
    for i in range(sum):
        tmpEnd = tmpStart + N
        MList[i] = C[tmpStart:tmpEnd]
        tmpStart = tmpEnd
    # 生成密文
    M = ""
    for j in range(N):
        for i in range(sum):
            tmpLen = len(MList[i])
            if tmpLen > j:
                M += MList[i][j]
    print("明文:[ {} ] 行数:[ {} ] 密文:[ {} ]  ".format(C, N, M))

def decodeResult(M,N):
    """
    栅栏解密
    :param M: 密文
    :param N: 几列
    """
    # 去除空格
    M = ''.join(M.split())
    # 计算出有几列是最长的
    howLong = len(M) % N
    # 计算出最长的一列有几个元素
    longNum = math.ceil(len(M) / N)
    # 生成字典
    MList = {}
    tmpHow = 0
    tmpStart = 0
    for i in range(N):
        tmpEnd = tmpStart + longNum
        if tmpHow < howLong:
            tmpHow += 1
        else:
            if tmpHow != 0:
                tmpEnd -= 1
        MList[i] = M[tmpStart:tmpEnd]
        tmpStart = tmpEnd
    # 生成明文
    C = ""
    tmpHow = 0
    # 生成明文
    for i in range(longNum):
        for j in range(N):
            tmpLen = len(MList[j])
            if i >= tmpLen: continue
            else:C += MList[j][i]
    print("密文:[ {} ] 行数:[ {} ] 明文:[ {} ]".format(M,N,C))

def decode(M,N = 0):
    """
    栅栏解密
    :param M: 密文
    :param N: 行数
    """
    # 没有赋值行数,采用爆破法
    if N == 0:
        for N in range(len(M)):
            if N == 0 or N == 1: continue
            decodeResult(M,N)
    else:
        decodeResult(M,N)

encode(C,N)
decode(M,N)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文