python实现栅栏密码加解密

1.栅栏密码介绍

所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。 —百度百科

例如:
将明文字符串”hello world”分为2组,即栅栏(密钥)为2。

去掉空格:helloworld
2个1组:
    he
    ll
    ow
    or
    ld
取第一个字母组合:hlool
取第二个字母组合:elwrd
最后得到栅栏加密为:hloolelwrd
复制代码

注意:当len(strings)%n != 0时,缺少的位数使用@填充。len(strins)代表明文字符串长度,n代表栅栏数(密钥)。

2.栅栏密码加密

fence_Passwd_encode.py:

#!/usr/bin/python
# Env: python3
# Author: afei_0and1
# -*- coding: utf8 -*-

def fence_Passwd_encode():
    string = input('请输入需要加密的明文:')
    num = int(input('请输入栅栏数(密钥):'))
    res = ''
    for i in range(int(num)):
        #遍历循环输出结果
        for j in range(int(string.__len__()/num + 0.5)):
            #print(j)
            try:
                res += string[j*num+i]
            except:
                pass
    print(res)
            
if(__name__ == '__main__'):
    fence_Passwd_encode()
复制代码

3.栅栏密码解密(爆破)

fence_Passwd_burst.py:

#!/usr/bin/python
# Env: python3
# Author: afei_0and1
# -*- coding: utf8 -*-

import sys

def fence_Passwd_burst():
    if (len(sys.argv) < 2):
        print("-----------------------------------------------")
        print(" ")
        print("Useg: python %s <fence_encryp_string>" % sys.argv[0])
        print("eg: python fence_Passwd_burst.py 'hloolelwrd'")
        print(" ")
        print("-----------------------------------------------")
        return
    secret = sys.argv[1]
    
    #栅栏密码解密,循环遍历有多少栏
    res = [step for step in range(2, len(secret)) if len(secret)%step == 0]
    for step in res:
        flag = ''
        #获取解密结果,以step栏进行遍历获取解密后的flag
        for i in range(step):
            flag += secret[i::step]
        print('第%s栏: 解密结果:%s' %(str(step), flag))

if(__name__ == '__main__'):
    fence_Passwd_burst()

复制代码

微信图片_20210626230908.png

4.W型栅栏密码加密

W型栅栏密码是栅栏密码的变种,将明文按W型排列,然后将每一行的字母依次连起来组成密文,行数就是栅栏数,即密钥。解密则同样根据这个“W”图案,将每一列的字母依次连接起来组成明文。W型栅栏密码的密钥不只是密文长度的因数,任何小于密文长度大于1的整数都有可能。

fence_W-Type-encode.py:

#!/usr/bin/python
# Env: python3
# Author: afei_0and1
# -*- coding: utf8 -*-

import sys

def generaget_W():
    if (len(sys.argv) < 3):
        print("-----------------------------------------------")
        print(" ")
        print("Useg: python %s <string> <col_num>" % sys.argv[0])
        print("eg: python fence_W-Type_encode.py helloworld 3")
        print(" ")
        print("-----------------------------------------------")
        return
    string = sys.argv[1]
    num = sys.argv[2]
    
    arr = [['*']*len(string) for i in range(int(num))]
    #行数,初始定义为0
    row = 0
    upflag = False
    #在矩阵上按“W”画出string
    for column in range(len(string)):
        arr[row][column] = string[column]
        if row == int(num)-1:
            upflag = True
        if row == 0:
            upflag = False
        if upflag:
            #上边界
            row -= 1
        else:
            #下边界
            row += 1
    #打印W图案
    for i in arr:
        print(i)
    
    #存放加密结果
    res = []
    for row in range(int(num)):
        for column in range(len(string)):
            if arr[row][column] != '*':
                res.append(arr[row][column])
    print(''.join(res))
    
if(__name__ == '__main__'):
    generaget_W()

复制代码

原文地址:blog.csdn.net/qq_41490561…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享