python实现W形栅栏密码加密与解密(超简单)

本人文笔不行,全靠读者想象

下面是进行加密的代码,具体加密原则如图:

就是一个W形,只不过将斜线变成的直线,去掉了多余的空格。那么就有以下的写法

def w_zhalan_jia(text, n, TYPE):
    # n小于2时不满足栅栏的最小形成条件
    if n < 2:
        return ""
    string1 = [[] for _ in range(0, n)]
    for i in range(0, n):
        for j in range(0, int((len(text) / (n-1))+1)):
            string1[i].append(-1)
    flag = 1  # 方向标准 1 向下  -1  向上
    hang = 0  # 行定位变量
    lie = 0  # 列定位变量
    po = 1  # 控制波动
    for password in text:  # 迭代每一个字符
        if hang == 0:
            flag = 1
        if hang == (n - 1):
            flag = -1
        if po == n:
            lie = lie + 1
            po = 1
        string1[hang][lie] = password
        hang = hang + flag
        po = po + 1
    password = ""
    string_password = []
    for i in range(0, n):
        for j in range(0, int((len(text) / (n-1)))+1):
            if string1[i][j] != -1:
                string_password.append(string1[i][j])
    for ps in string_password:
        password = password + str(ps)
    if TYPE == 0:#返回处理后列表
        return password
    if TYPE == 1:
        return string_password#返回字符串
    if TYPE == 2:
        return string1#返回处理前列表

加密如此,解密就是反正来。我们可以给密文的每个字符进行编号,从0开始进行编号,充分利用数组,再反过去对编号进行一次加密,这样就得到了与密文对应位置的编号,而这些编号就是再密文未加密前在字符串中的位置。

以下是解密的函数代码:

def w_zhalan_jie(text, n):
    # n小于2时不满足栅栏的最小形成条件
    if n < 2:
        return ""
    str_key = list(range(0, len(text)))  # 获取加密数据长度并创建相应的列表
    key_password = list(w_zhalan_jia(str_key, n, 1))  # 密码下标列表
    key_text = list(text)  # 原始密文
    key = ""
    # 对应下标的赋值
    for password in range(0, len(text)):
        str_key[key_password[password]] = key_text[password]
    # 返回字符串
    for tx in str_key:
        key = key + tx
    return key

以上程序与思路,我应该写的很清楚了,在这算法方面会有欠缺,欢迎大佬前来改正,第一次文章发可能会有许多欠缺,各位不要喷我呀

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值