【网络安全】python实现栅栏密码加解密

1.栅栏密码介绍

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

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

去掉空格:helloworld
2个1组:
 helloworld
取第一个字母组合: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:passprint(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("-----------------------------------------------")returnsecret = sys.argv[1]#栅栏密码解密,循环遍历有多少栏res = [step for step in range(2, len(secret)) if len(secret)%step == 0]for step in res:flag = ''#获取解密结果,以step栏进行遍历获取解密后的flagfor i in range(step):flag += secret[i::step]print('第%s栏: 解密结果:%s' %(str(step), flag))

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

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("-----------------------------------------------")returnstring = sys.argv[1]num = sys.argv[2]arr = [['*']*len(string) for i in range(int(num))]#行数,初始定义为0row = 0upflag = False#在矩阵上按“W”画出stringfor column in range(len(string)):arr[row][column] = string[column]if row == int(num)-1:upflag = Trueif row == 0:upflag = Falseif upflag:#上边界row -= 1else:#下边界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…

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
W型栅栏密码是一种简单的加密算法,它通过将明文按照一定规则排列成W型,然后按照特定顺序读取密文来实现加密。解密W型栅栏密码的过程与加密相反,需要按照相同的规则重新排列密文,然后按照特定顺序读取明文。 以下是一个使用C++实现W型栅栏密码解密的示例代码: ```cpp #include <iostream> #include <string> std::string decryptWZhalan(const std::string& ciphertext, int numRows) { if (numRows <= 1) { return ciphertext; } int len = ciphertext.length(); std::string plaintext(len, ' '); int cycleLen = 2 * numRows - 2; int index = 0; for (int i = 0; i < numRows; i++) { for (int j = 0; j + i < len; j += cycleLen) { plaintext[index++] = ciphertext[j + i]; if (i != 0 && i != numRows - 1 && j + cycleLen - i < len) { plaintext[index++] = ciphertext[j + cycleLen - i]; } } } return plaintext; } int main() { std::string ciphertext = "WZHALNCPTOY"; int numRows = 4; std::string plaintext = decryptWZhalan(ciphertext, numRows); std::cout << "Plaintext: " << plaintext << std::endl; return 0; } ``` 在上述代码中,`decryptWZhalan`函数接受两个参数:密文和栅栏的行数。它首先判断行数是否小于等于1,如果是,则直接返回密文。然后,根据W型栅栏的规则,按照特定顺序将密文中的字符重新排列成明文。最后,返回解密后的明文。 在示例代码中,我们使用了一个密文"WZHALNCPTOY"和4行的栅栏进行解密。运行代码后,将输出解密后的明文"WHYCATZLONP"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值