日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/31 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栅栏密码怎么写java程序_栅栏密码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2欄柵欄密碼:

比如明文:THERE IS A CIPHER

去掉空格后變?yōu)?#xff1a;THEREISACIPHER

兩個一組,得到:TH ER EI SA CI PH ER

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

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

連在一起就是:TEESCPEHRIAIHR

而解密的時候,先把密文從中間分開,變?yōu)閮尚?#xff1a;

T E E S C P E

H R I A I H R

再按上下上下的順序組合起來:

THEREISACIPHER

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

THERE IS A CIPHER

主要像是矩陣,以列為順序依次取數(shù)。

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

多欄柵欄密碼:

明文:THERE IS A CIPHER

七個一組:THEREIS ACIPHER

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

組合得到密碼:TAHCEIRPEHIESR

可以通過分析密碼的字母數(shù)來解出密碼

比如:TAHCEIRPEHIESR

一共有14個字母,可能是2欄或者7欄

嘗試2欄--》失敗

嘗試7欄--》成功

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

當字母數(shù)m為偶數(shù)時,分欄數(shù)可能是其因子

當字母數(shù)m為奇數(shù)時,可能是前m-1個均分,最后一個獨自成行,當然也可能m+1均分,任意分都有可能

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

完整測試例子如下:

import java.util.Scanner;

public class 柵欄密碼技術(shù) {

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"

+ "第二行輸入分欄數(shù)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);

}

}

運行結(jié)果如下:

第一行輸入明文字符

第二行輸入分欄數(shù)n

abcdefghijk

3

密文如下:

aeibfjcgkdh

解密后明文如下:

abcdefghijk

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

注意:加密時的分欄數(shù)(行數(shù))為解密時的列數(shù)

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

總結(jié)

以上是生活随笔為你收集整理的栅栏密码怎么写java程序_栅栏密码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。