本人文笔不行,全靠读者想象
下面是进行加密的代码,具体加密原则如图:
就是一个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
以上程序与思路,我应该写的很清楚了,在这算法方面会有欠缺,欢迎大佬前来改正,第一次文章发可能会有许多欠缺,各位不要喷我呀