2栏栅栏密码:

比如明文:THERE IS A CIPHER

去掉空格后变为:THEREISACIPHER

两个一组,得到:TH ER EI SA CI PH ER

先取出每行第一个字母:TEESCPE

再取出每行第二个字母:HRIAIHR

连在一起就是:TEESCPEHRIAIHR

而解密的时候,先把密文从中间分开,变为两行:

T E E S C P E

H R I A I H R

再按上下上下的顺序组合起来:

THEREISACIPHER

分出空格,就可以得到原文了:

THERE IS A CIPHER

主要像是矩阵,以列为顺序依次取数。

------------------------------------------------

多栏栅栏密码:

明文:THERE IS A CIPHER

七个一组:THEREIS ACIPHER

抽取字母:TA HC EI RP EH IE SR

组合得到密码:TAHCEIRPEHIESR

可以通过分析密码的字母数来解出密码

比如:TAHCEIRPEHIESR

一共有14个字母,可能是2栏或者7栏

尝试2栏--》失败

尝试7栏--》成功

-------------------------------------------------

当字母数m为偶数时,分栏数可能是其因子

当字母数m为奇数时,可能是前m-1个均分,最后一个独自成行,当然也可能m+1均分,任意分都有可能

-----------------------------------------------------------------------------------------

完整测试例子如下:

import java.util.Scanner;

public class 栅栏密码技术 {

public static String quitBlank(String normalStr){

StringBuffer sBuffer=new StringBuffer();

for (int i = 0; i < normalStr.length(); i++) {

if(normalStr.charAt(i)!=' ')

sBuffer.append(normalStr.charAt(i));

}

return sBuffer.toString();

}

public static String En(int n,String Mstr){

StringBuffer result=new StringBuffer();

int step=(int)((double)Mstr.length()/n+0.5);

String[] splitStr=new String[n];

int temp=0;

for (int i = 0; i < n; i++) {

if(temp+step

splitStr[i]=Mstr.substring(temp, temp+step);

else

splitStr[i]=Mstr.substring(temp, Mstr.length());

temp+=step;

}

for (int i = 0; i < step; i++) {

for (int j = 0; j < n; j++) {

if(i

result.append(splitStr[j].charAt(i));

}

}

}

return result.toString();

}

public static String Dn(int n,String Mstr){

StringBuffer result=new StringBuffer();

int step=(int)((double)Mstr.length()/n+0.5);

String[] splitStr=new String[step];

int temp=0;

for (int i = 0; i < step; i++) {

if(temp+n

splitStr[i]=Mstr.substring(temp, temp+n);

else

splitStr[i]=Mstr.substring(temp, Mstr.length());

temp+=n;

}

for (int i = 0; i < n; i++) {

for (int j = 0; j < step; j++) {

if(i

result.append(splitStr[j].charAt(i));

}

}

}

return result.toString();

}

public static void main(String[] args) {

Scanner scan=new Scanner(System.in);

System.out.println("第一行输入明文字符\n"

+ "第二行输入分栏数n");

String normalStr=scan.nextLine();

int n=scan.nextInt();

String Mstr=quitBlank(normalStr);

String EnStr=En(n, Mstr);

System.out.println("密文如下:\n"+ EnStr);

String DnStr=Dn(n, EnStr);

System.out.println("解密后明文如下:\n"+ DnStr);

}

}

运行结果如下:

第一行输入明文字符

第二行输入分栏数n

abcdefghijk

3

密文如下:

aeibfjcgkdh

解密后明文如下:

abcdefghijk

----------------------------------

注意:加密时的分栏数(行数)为解密时的列数

取值时均由上至下按列取值即可。

栅栏密码怎么写java程序_栅栏密码相关推荐

  1. 栅栏密码怎么写java程序_简单栅栏密码加密器的JSF版

    其实就是把昨天的这个程序放到一个WEB应用程序了,大体的程序没有什么变化,只有少许改动.创建一个FencePassword类,这个类有两个属性,一个是oldMessage表示加密前的信息,一个是new ...

  2. pat上写java程序_如何运行Java程序和设置CLASSPAT

    导读: 如何运行JAVA和CLASSPATH环境变量的设置是学习和使用JAVA中最基本的问题,本不应在此赘述.但近来不少人在论坛上提出的问题却与此有关,我平时碰到的一些初学者也往往在这个问题上卡了壳, ...

  3. cmd写java程序_用cmd写一个最简单的Java程序

    一,准备: 1.确保电脑中装有eclipse软件并且确保配置好环境变量 (1)环境变量配置方法: 特别提示:jdk和eclipse保存的路径不能有中文字符 1.打开我的电脑--属性--高级--环境变量 ...

  4. 如何用命令行写java程序_如何用java实现doc命令行

    如何用java实现doc命令行, dir显示当前所有目录下的文件 cd 文件目录 进入到该目录 cd ..退到上级目录,一面是我写的代码,调试了. 不过有点小bug就是当你进去的是文件就会提示空指针异 ...

  5. 控制台编写JAVA程序教程_写一个java程序的步骤是什么?写java程序技巧

    写Java程序是要按照步骤来的,这样才能写好一个java程序,那么接下来,我们就来给大家讲解一下写一个java程序的步骤是什么? (1)创建Java项目:"FileàNewàProjectà ...

  6. 第一段Java程序_借助Win控制命令台编译执行 编辑器Notepad++

    第一段Java程序_借助Win控制命令台编译执行 编辑器Notepad++ 准备代码: 第一次编译: 显然需要先配置环境变量: 先找到java.exe和javac.exe所在的文件夹位置: 此电脑-& ...

  7. 【小题目】写JAVA程序时可以创建一个名为123.java的源文件吗

    在写JAVA程序时创建名为123.java的源文件,前提是该源文件中没有public修饰的类,因为一旦使用public修饰后类名必须与文件名相同,而类名为标识符,不能以数字开头.因此,在没有用publ ...

  8. 如何用记事本写Java程序

    用记事本写Java程序 事先准备: 安装并配置好Java运行环境(JDK) 确认你的电脑中有记事本 确认电脑中的命令行窗口可以正常使用 ​ 开始: 首先,打开记事本,输入你要写的程序,例如: clas ...

  9. 女朋友生日java程序_★★女朋友要过生日了!我想用java为她写一个程序,一举两得啊! 希望大家多提建议啊!谢谢!!!...

    女朋友要过生日了,我想用java为她写一个程序,所以想请教大家,  希望大家给我出出点子, 同时手头有3D  等漂亮图形的java程序或其他一些特效的文字,图形java程序,都希望大家多提供,  多帮 ...

  10. qtp启动java程序_转: QTP六脉神剑之调用Java程序

    查看( 1147 ) / 评论( 21 ) 六脉神剑之调用程 序0Xp1zLN_0版权声明:原创作品,转载请以链接方式注明出自http://www.51testing.com/?35,否则将追究法律责 ...

最新文章

  1. Android Studio 选项菜单和动画结合_谷歌准备为Android增加像iOS一样的功能
  2. p3295 [SCOI2016]萌萌哒
  3. YZYZ菜鸟编程小助手
  4. 关于vue父子组件之间事件触发及数据传递问题
  5. net framework 3.5 安装错误_PageAdmin CMS建站系统报http403错误的解决方案
  6. mysql binary 查询_MYSQL的binary解决mysql数据大小写敏感问题 《转载》
  7. 1. OpenMAX系列 —— ACodec和OMX的联系
  8. keepalived漂移VIP故障
  9. 5.PHP 命令行模式
  10. c语言会变颜色程序,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...
  11. 入坑codewars第五天-Dubstep、Regex validate PIN code
  12. md文件转换为pdf文件(带目录和不带目录简捷操作)
  13. python读取图片的exif信息
  14. MULTIPLE SPRING BOOT RUN CONFIGURATIONS WERE DETECTED. RUN DASHBOARD ALLOWS TO【已解决】
  15. List集合中根据相同属性的对象合并计算
  16. [置顶] 得失寸心知
  17. PS绘制扁平化风格相机镜头UI图标
  18. Oracle中的日期时间函数
  19. ChatGPT4高分通过数据库系统工程师(DBA)认证
  20. C++ enable_if的使用

热门文章

  1. ASPEN hysys焓值、熵值转化换算
  2. windows server 2012 安装 VC14(VC2015) 安装失败解决方案
  3. android自动计步_Android计步模块(类似微信运动)
  4. php表单验证插件下载,强力推荐10款Javascript表单验证插件
  5. 微信小程序-wxParse插件的使用
  6. TCP/UDP调试工具
  7. 使用 iPerf 测试路由器局域网性能
  8. Linux下安装qt5步骤
  9. 计算机安装软件没有管理员权限设置,实用技巧:如何在win10中安装没有管理员权限的软件...
  10. ubuntu下好用的TCP/UDP调试工具