栅栏密码怎么写java程序_栅栏密码
2欄柵欄密碼:
比如明文:THERE IS A CIPHER
去掉空格后變?yōu)?#xff1a;THEREISACIPHER
兩個(gè)一組,得到:TH ER EI SA CI PH ER
先取出每行第一個(gè)字母:TEESCPE
再取出每行第二個(gè)字母:HRIAIHR
連在一起就是:TEESCPEHRIAIHR
而解密的時(shí)候,先把密文從中間分開,變?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
七個(gè)一組:THEREIS ACIPHER
抽取字母:TA HC EI RP EH IE SR
組合得到密碼:TAHCEIRPEHIESR
可以通過分析密碼的字母數(shù)來解出密碼
比如:TAHCEIRPEHIESR
一共有14個(gè)字母,可能是2欄或者7欄
嘗試2欄--》失敗
嘗試7欄--》成功
-------------------------------------------------
當(dāng)字母數(shù)m為偶數(shù)時(shí),分欄數(shù)可能是其因子
當(dāng)字母數(shù)m為奇數(shù)時(shí),可能是前m-1個(gè)均分,最后一個(gè)獨(dú)自成行,當(dāng)然也可能m+1均分,任意分都有可能
-----------------------------------------------------------------------------------------
完整測(cè)試?yán)尤缦?#xff1a;
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);
}
}
運(yùn)行結(jié)果如下:
第一行輸入明文字符
第二行輸入分欄數(shù)n
abcdefghijk
3
密文如下:
aeibfjcgkdh
解密后明文如下:
abcdefghijk
----------------------------------
注意:加密時(shí)的分欄數(shù)(行數(shù))為解密時(shí)的列數(shù)
取值時(shí)均由上至下按列取值即可。
總結(jié)
以上是生活随笔為你收集整理的栅栏密码怎么写java程序_栅栏密码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 拼接字符串查询
- 下一篇: sm2和sm4加密算法浅析