python3解密栅栏密码的正确方法

article/2025/10/3 21:12:31

python3解密栅栏密码的正确方法

今天在做ctf时想找一个栅栏密码的解密脚本,在网上搜过了下,发现竟然没找到一个正确的脚本(也可能是自己的搜索水平太差),倒不是说大家的脚本都有问题,只是在解决特殊情况时会出错。

比如这个帖子里的:
https://blog.csdn.net/weixin_42109012/article/details/97535995
如果加密abcdef 每组字数为4,那么加密后应该是aebfcd,但是按上面的那个贴子里的代码去解密会得到acedbf
在这里插入图片描述

再比如这个里面的:
https://blog.csdn.net/abc_12366/article/details/87197344
在这里插入图片描述
这个代码也算不出我给的情况,并且里面用的参数是分多少栏,这个我觉得也是不合适的,因为假如字符串有长度为7,分为2栏的话,就会几种情况:

  • 每组字数为4,那么第一组为4,第二组为3
  • 每组字数为5,那么第一组为5,第二组为2
  • ……
    而这几种情况加密后的结果是不一样的,所以必须规定每组字数,才更为准确。

为了解决这种不字符长度不能被每组字符数整除的情况,我考虑了好一会,开始想人为的分组,或者分不同余数情况来分别处理,最后效果都不好。
最终我想出来一个比较合适的算法就是补位。
例如上面的例子:aebfcd, 每组字符数为4
字符串长度为6,不能被4整除,那么就补位,因为4*2=8, 那么需要补2位
如果用-代替补位,那么就是aebfc-d-,再进行解码就很好解了,用前面两个文章里的代码都能解出来。其实程序不难,关键是想到怎么样才能解决不能整除的特殊情况。

完整的代码如下:

# _*_ encoding:utf-8 _*_
import mathdef buwei(encrypted_str,fence_length):    # 比如 14,4str_len = len(encrypted_str)fence_count = math.ceil(str_len/ fence_length)   # 得出4target_length = fence_count*fence_lengthjiequ = []while str_len<target_length:encrypted_str = encrypted_str + '*'jiequ.append(encrypted_str[-fence_count :])encrypted_str = encrypted_str[:-fence_count]str_len += 1jiequ.reverse()s = ''for i in jiequ:s = s + iresult = encrypted_str + sreturn resultdef decrypt_fence(encrypted_str,fence_length):encrypted_str = buwei(encrypted_str,fence_length)if fence_length>=len(encrypted_str) or fence_length<1:print("栅栏长度太大或者太小,无需解密")returnfence_count = math.ceil(len(encrypted_str)/fence_length)elen=len(encrypted_str)# b = elen // f  # 用字符串实际长度除以上面计算出能整出的数字fresult = {x: '' for x in range(fence_count)}for i in range(elen):  # 字符串有多少位,就循环多少次a = i % fence_countresult.update({a: result[a] + encrypted_str[i]})  # 字符串截断,并更新数据d = ''for i in range(len(result)):d += result[i]d = d.replace("*", '')print(f'假设每栏字数为:{fence_length},解密结果为:{d}')  # 输出结果,并开始下一个循环decrypt_fence('adbecf', 4)

经测试,可以正确的处理各种不被整除的情况,本人业余编程爱好者,如果有代码有错误或者要改进的地方,欢迎大家评论,另外如果有更好的算法,也请告知我下,谢谢啦。


http://chatgpt.dhexx.cn/article/GnvZ1cJE.shtml

相关文章

维吉尼亚密码加密/解密在线工具

维吉尼亚密码加密/解密在线工具&#xff0c;工具链接&#xff1a;http://www.atoolbox.net/Tool.php?Id856 维吉尼亚密码是在凯撒密码基础上产生的一种加密方法&#xff0c;它将凯撒密码的全部25种位移排序为一张表&#xff0c;与原字母序列共同组成26行及26列的字母表。另外…

Crypto之栅栏密码

栅栏密码是一种简单的移动字符位置的加密方法&#xff0c;规则简单&#xff0c;容易破解。栅栏密码的加密方式&#xff1a;把文本按照一定的字数分成多个组&#xff0c;取每组第一个字连起来得到密文1&#xff0c;再取每组第二个字连起来得到密文2……最后把密文1、密文2……连…

CTF-Show密码学【Base64、栅栏密码、16进制】

题目内容 密文&#xff1a;53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D 提交格式&#xff1a;KEY{XXXXXXXXXXXXXX}工具下载&#xff1a;https://www.lanzoui.com/i9fn2aj萌新_密码13 分析和解决过程 初步分析…

CTF密码学·置换密码,栅栏密码,曲路密码

CTF密码学置换密码&#xff0c;栅栏密码&#xff0c;曲路密码 1.置换密码列置换周期置换 2.栅栏密码3.曲路密码 1.置换密码 置换密码&#xff08;Permutation Cipher)又叫换位密码&#xff08;Transposi-tionCipher)&#xff0c;它根据一定的规则重新排列明文&#xff0c;以便…

从加(解)密角度讲栅栏密码

目录 普通型栅栏加密原理解密原理 W型栅栏加密原理实例 解密原理 这今天在做新生赛的一道“只有倒着翻过十八层的篱笆才能抵达北欧神话的终点”&#xff0c;研究了很长时间的栅栏原理&#xff0c;flag没出来&#xff0c;而且自己对于普通和W型的加密解密整的有的蒙… 原先一篇文…

栅栏密码及其变形W型栅栏密码

栅栏密码 题目描述 名称&#xff1a;铁栅栏 提示&#xff1a;我拿到一幅画&#xff0c;上面画着一个农妇在栅栏里面喂5只小鸡 密文&#xff1a;Sv9eaj3O}B{zy1vailw5YFhQ 加密原理 把将要传递的信息中的字母交替排成上下两行。再将下面一行字母排在上面一行的后边&#x…

详解W形状的栅栏密码

最近做密码学题目的时候碰到了一个特别的栅栏密码&#xff1a;加密后为&#xff1a;ccehgyaefnpeoobe{lcirg}epriec_ora_g&#xff0c;由题目得知密钥为5&#xff0c;在网上用普通的解码器只会得到一个令人黑人问号的字符串&#xff0c;在网上找题解的时候才知道这叫W形栅栏密码…

栏栅解密

围在栏栅中的爱&#xff08;栏栅密码&#xff09; 我们需要了解什么是栏栅密码&#xff0c;经过我的百度了解到 所谓栅栏密码&#xff0c;就是把要加密的明文分成N个一组&#xff0c;然后把每组的第1个字连起来&#xff0c;形成一段无规律的话。 不过栅栏密码本身有一个潜规则…

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

1.栅栏密码介绍 所谓栅栏密码&#xff0c;就是把要加密的明文分成N个一组&#xff0c;然后把每组的第1个字连起来&#xff0c;形成一段无规律的话。不过栅栏密码本身有一个潜规则&#xff0c;就是组成栅栏的字母一般不会太多。 —百度百科 例如&#xff1a; 将明文字符串&quo…

W型加密栅栏密码解密

题目描述&#xff1a;被小鱼一连将了两军&#xff0c;你心里更加不服气了。两个人一起继续往前走&#xff0c; 一路上杂耍卖艺的很多&#xff0c;但是你俩毫无兴趣&#xff0c;直直的就冲着下一个谜题的地方去了。 到了一看&#xff0c;这个谜面看起来就已经有点像答案了样子了…

python实现栅栏密码加解密

1.栅栏密码介绍 所谓栅栏密码&#xff0c;就是把要加密的明文分成N个一组&#xff0c;然后把每组的第1个字连起来&#xff0c;形成一段无规律的话。不过栅栏密码本身有一个潜规则&#xff0c;就是组成栅栏的字母一般不会太多。 —百度百科 例如&#xff1a; 将明文字符串&quo…

CTF之做题总结(二)

Crypto&#xff08;密码学&#xff09;做题记录 1、Railfence&#xff08;栅栏密码&#xff09; 我们先来看一下题目描述&#xff1a; 题目附件的内容是&#xff1a; ccehgyaefnpeoobe{lcirg}epriec_ora_g 从题目Railfence&#xff08;栅栏密码&#xff09;和题目描述中我们…

攻防世界 crypto Railfence

Railfence 题目 附件 ccehgyaefnpeoobe{lcirg}epriec_ora_g 栅栏密码 ①把将要传递的信息中的字母交替排成上下两行。 ②再将下面一行字母排在上面一行的后边&#xff0c;从而形成一段密码。 ③例如&#xff1a; 明文&#xff1a;THE LONGEST DAY MUST HAVE AN END 加密&…

sql server 替换字符串中的某些字符

declare stringFinal nvarchar(128) declare index intset stringOrigin 111,222,333 set stringChange 999 --将字符串stringOrigin中“,”之前的部分换成stringChange--先获取“,”在stringOrigin中的索引 set index charindex(,,stringOrigin,1) --charindex(想要找到的字…

【MySql】sql语句--批量替换字符串

【需求】 项目中需要批量替换mysql数据库中&#xff0c;指定表中的指定字段中的字符串。 【实现】 方法一&#xff1a; 可以用mysql可视化工具---Navicat&#xff0c;直接ctrlF&#xff0c;然后点击替换前的选框。如下图&#xff1a; 也或者可以从菜单中找到替换&#xff0c;…

sql 字符串函数

代码写出来如下&#xff1a; 代码有点多没截完 第二个表如下&#xff1a; 代码如下展示&#xff1a; 第三个表如下&#xff1a; 代码如下&#xff1a; 第四张表 代码如下&#xff1a; 字符串函数 1.charindex 用来寻找这个字在字符串中的位置 select charindex(SQl,my SQL C…

SQL截取字符串和替换字段

1.要操作的数据库的表 2. SELECT left(operateperson,2) from bus_inport left(str,length) str&#xff1a;被截取的字符串。 length&#xff1a;截取的长度 从左边开始截取 执行的结果&#xff1a; 3. SELECT right(operateperson,1) from bus_inport right(str,length)…

SQL Server 数据库之字符串函数

字符串函数 1. 概述2. ASCII 函数3. Charindex 函数4. Left 函数5. Right 函数6. Len 函数7. Replace 函数8. Reverse 函数9. Str 函数10. Substring 函数 1. 概述 用字符串函数能对输入字符串进行类型转换和长度设置等操作&#xff0c;是数据库处理中常用的函数类型&#xff…

sql server中replace()函数,可用于字符串替换

语法 sql server中replace()函数&#xff0c;可用于字符串替换 replace(string1,string2,string3) string1:搜索的文本 string2&#xff1a;查找的文本 string3&#xff1a;替换的文本 示例-名字替换 select replace(张三,三,四) 结果 张四 延伸示例-分类 分类&#x…

sqlserver替换特殊字符

1.直接转换 select REPLACE(列名,’’,’’) from 表 2.函数转换 先查询字符的ascii码 select ascii()得到结果 通过char转换成字符串 char(64) --返回然后去替换 select REPLACE(列名,char(64),) from 表常用字符串函数文档 https://blog.csdn.net/qq_39569480/article…