最近做密码学题目的时候碰到了一个特别的栅栏密码:加密后为:ccehgyaefnpeoobe{lcirg}epriec_ora_g,由题目得知密钥为5,在网上用普通的解码器只会得到一个令人黑人问号的字符串,在网上找题解的时候才知道这叫W形栅栏密码
话说我在网上搜资料的时候没有搜到太多与这有关的东西,本来想做一个不动脑子的伸手党。。。。现实却在逼迫我不得不去思考。。。。我这算第一个写这个的人不[手动滑稽]

如图,字符串“123456789”的密钥为3的话,就如上图所排列,然后得到密文:“159246837”。
然后该怎样去写一个解这样密码的程序呢,蒟蒻的我陷入了深深的思考。。。。

--------------------------------------------------------------很久很久之后--------------------------------------------
发现:当key=3时,一共分成了三行,打乱前的第一第五第九分别变成了打乱后的第一二三,这两个数之间相差4也就是(key-1)2,第key行与第一行相同,。再看第二行,难道是2n吗???我决定将数据放大再研究一番,当len=35,key=5时(这个就自己画一画吧)然后你就会发现:首行和尾行的间隔依旧不变,假设行数为i,当当前数为第2行的奇数的时候,下一个数字为2+6=8也就是(key-i)*2,若当前数为第二行偶数的时候,下一个数字为8+2=10也就是(i-1)*2。而且每一行的第一个数字就是这一行的行数。对不对?再用C++水个代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char str[10000];
char ans[1000];
int line=0;
int key;
int len;
int sit;
int ssit;//用于判断当前字符的位置为奇数还是偶数
int check()//我刚才的思想
{if(line==1 ||line==key)return sit+(key-1)*2;else{if(ssit%2==1)return sit+(key-line)*2;else return sit+2*(line-1);}
}
int main()
{int i;cin>>str;scanf("%d",&key);len=strlen(str);for(i=len;i>0;i--)str[i]=str[i-1];//给他往前挪一位,方便操作。line=1;sit=1;ssit=1;for(i=1;i<=len;i++)//把密文按顺序安排到原来明文的位置上{ans[sit]=str[i];sit=check();查找下一个位置ssit++;if(sit>len)//超过长度了这个位置肯定不存在字符{line++;sit=line;//因为每一行第一个字符的位置恰好与行数的数字一样ssit=1;}}for(i=1;i<=len;i++)printf("%c",ans[i]);//cout<<ans;应该也行,没改return 0;
}


哼哼,谁也无法阻止我去找到密码!!!
あるものは隠された。へへへ
はい、以上終わりました、ご覧くださってありがとうございます。
2019.10.1更新:
TMD我写这篇文章之前一个写代码的都没有,我这篇一出来再搜索W栅栏密码都更新了自己的脚本。F**k,就不能让我做个伸手党吗[手动滑稽]

详解W形状的栅栏密码相关推荐

  1. linux用户密码管理,Linux_详解Linux中的用户密码管理命令passwd和change,passwd 修改用户密码参数 nbsp - phpStudy...

    详解Linux中的用户密码管理命令passwd和change passwd 修改用户密码 参数 -k 保持未过期身份验证令牌 -l 关闭账号密码.效果相当于usermod -L,只有root才有权使用 ...

  2. IBM服务器win7系统忘记密码,图文详解Win7系统忘记开机密码的处理方法

    许多小伙伴都遇到过Win7系统忘记开机密码的问题,虽说设置开机密码能保护系统安全,但偶尔也会出现忘记密码的情况,这要怎么办?难道没办法操作系统了吗?别着急,这里图文详解一下Win7系统忘记开机密码的处 ...

  3. linux 账号密码 字段,详解Linux中的用户密码管理命令passwd和change

    passwd 修改用户密码 参数 -k 保持未过期身份验证令牌 -l 关闭账号密码.效果相当于usermod -L,只有root才有权使用此项. -u 恢复账号密码.效果相当于usermod -U,同 ...

  4. 生成linux命令,详解Linux下随机生成密码的命令总结

    有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下 ...

  5. 详解忘记linux root用户密码的措施

    话说上次不是成功找回了root密码么= = 这次就凭着记忆写一下吧= = 首先在Grub上把浮标选在linux上...然后按e进入编辑启动脚本界面= = 然后,把光标停在倒数第二行上,把rw改成ro( ...

  6. 怎么更改计算机开机用户名和密码,小编详解怎么修改电脑开机密码

    更改电脑开机密码,大家在使用的时候为了能够保证自己电脑的安全,所以都会给电脑设置一个开机密码,等过一段时间的时候就会更改一下从而增加电脑的安全性,该如果进行更改电脑开机密码呢?莫急,小编这就给大家介绍 ...

  7. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  8. 16.linux用户和组详解演练,useradd,usermod,chage,userdel,id,su,groups,passwd,shadow,group,gshadow等命令和文件

    前言 本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义 ...

  9. oracle spool 分隔符_sqlplus--spool命令参数详解

    sqlplus--SPOOL参数详解 Spool是Oracle快速导出数据的工具,是sqlplus的指令,不是sql语法里的东西 一.Spool常用的设置 set arraysize 5000;  / ...

最新文章

  1. boost::hana::unfold_right用法的测试程序
  2. HDU - 4248 A Famous Stone Collector(dp+组合数学)
  3. 批准Oracle IDM中的特定Web服务
  4. Java面向对象(2)--类的成员属性
  5. 树莓派使用STEP8:使能串口调试
  6. golismero web扫描器
  7. Tomcat系列(6)——Tomcat处理一个HTTP请求的过程
  8. Android -- I/O CALL SMS Layout
  9. 【点阵液晶编程连载五】液晶驱动代码的移植
  10. Servlet+jsp用户登录加上验证码
  11. 【围棋棋盘绘制——html实现】
  12. 七彩虹显卡软件测试,显卡超频测试_七彩虹显卡_显卡评测-中关村在线
  13. 谷歌,微软,阿里,美团实习生面经
  14. 无人值守系统安装--自己的系统实用篇
  15. 矿大计算机学院的周裕浩,中矿大计算机学院举办“图灵教育计划”电子信息专业交流会...
  16. Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切
  17. linux 命令断网,linux 断网 扫描基本命令(示例代码)
  18. 后氧传感器正常数据_氧传感器电压多少正常?氧传感器数据流分析介绍
  19. 16S扩增子分析专题课01背景介绍
  20. 网络RTK服务和GPS有什么区别?现在哪些品牌在提供网络RTK服务?

热门文章

  1. 心中有信仰,脚下有力量
  2. SRM供应商关系管理是什么?SRM供应商关系管理系统包含哪方面的内容?
  3. 刚创立的眼镜店一个月达到1400多万的营业额?这个点子你可以看看
  4. 干细胞领域国际大佬盘点
  5. 手机鸿蒙可以当电脑用吗,华为雄心不小!鸿蒙要做PC系统?手机秒变“电脑主机”...
  6. 正则表达式的一些元符号
  7. 阿尔茨海默氏症救星!经典+量子混合方法加速药物发现
  8. java线程池工作原理和实现原理
  9. 利用计算机控制,如何使用计算机控制遥控车
  10. Spark面试题——常问