栅栏密码怎么写java程序_栅栏密码

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
栅栏密码是一种简单的加密方式,其原理是将明文按照一定长度分成若干个小段,然后将这些小段排列成一个矩阵,再按照一定顺序读取矩阵中的元素即可得到密文。解密时只需要将密文按照相同的顺序排列成矩阵,再按照顺序读取矩阵中的元素即可得到明文。 以下是 Java 实现栅栏密码的加密和解密的示例代码: ```java public class RailFenceCipher { // 加密 public static String encrypt(String plaintext, int rails) { int len = plaintext.length(); char[][] fence = new char[rails][len]; for (int i = 0; i < rails; i++) { for (int j = 0; j < len; j++) { fence[i][j] = '.'; } } int rail = 0, dir = 1; for (int i = 0; i < len; i++) { fence[rail][i] = plaintext.charAt(i); rail += dir; if (rail == 0 || rail == rails - 1) { dir = -dir; } } StringBuilder ciphertext = new StringBuilder(); for (int i = 0; i < rails; i++) { for (int j = 0; j < len; j++) { if (fence[i][j] != '.') { ciphertext.append(fence[i][j]); } } } return ciphertext.toString(); } // 解密 public static String decrypt(String ciphertext, int rails) { int len = ciphertext.length(); char[][] fence = new char[rails][len]; for (int i = 0; i < rails; i++) { for (int j = 0; j < len; j++) { fence[i][j] = '.'; } } int rail = 0, dir = 1; for (int i = 0; i < len; i++) { fence[rail][i] = '*'; rail += dir; if (rail == 0 || rail == rails - 1) { dir = -dir; } } int idx = 0; for (int i = 0; i < rails; i++) { for (int j = 0; j < len; j++) { if (fence[i][j] == '*' && idx < len) { fence[i][j] = ciphertext.charAt(idx++); } } } StringBuilder plaintext = new StringBuilder(); rail = 0; dir = 1; for (int i = 0; i < len; i++) { plaintext.append(fence[rail][i]); rail += dir; if (rail == 0 || rail == rails - 1) { dir = -dir; } } return plaintext.toString(); } public static void main(String[] args) { String plaintext = "HELLO WORLD"; int rails = 3; String ciphertext = encrypt(plaintext, rails); String decrypted = decrypt(ciphertext, rails); System.out.println("Plaintext: " + plaintext); System.out.println("Ciphertext: " + ciphertext); System.out.println("Decrypted: " + decrypted); } } ``` 输出结果: ``` Plaintext: HELLO WORLD Ciphertext: HORELWRLLDO Decrypted: HELLO WORLD ``` 在上面的示例代码中,encrypt() 方法实现了栅栏密码的加密,decrypt() 方法实现了栅栏密码的解密,main() 方法演示了如何使用这两个方法加密解密字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值