解釋
一般比較常見的是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
但是有些人就偏不把密碼作出2欄,比如:
明文:THERE IS A CIPHER
七個一組:THEREIS ACIPHER
抽取字母:TA HC EI RP EH IE SR
組合得到密碼:TAHCEIRPEHIESR
那麼這時候就無法再按照2欄的方法來解了...
不過棚欄密碼本身有一個潛規則,就是組成棚欄的字母一般不會太多。(一般不超過30個,也就是一、兩句話)
這樣,我們可以通過分析密碼的字母數來解出密碼...
比如:TAHCEIRPEHIESR
一共有14個字母,可能是2欄或者7欄...
嘗試2欄...失敗
嘗試7欄...成功
然而當棚欄和拼音相結合後,誕生出一種令人痛恨的新思路...
比如在正道學院網絡版的開篇flash中出現過這樣一個棚欄:
QGBKSYSHJIEUEIIIIAN
總共19個字母~貌似不符合棚欄的規則...其實是因為出現了一個叫做捆綁的冬冬:
Q G B K S Y SH J
I E U E I I IIAN
看到了嗎?上面是聲母,下面是韻母...
聲母中的sh和韻母中的ian都是被作者當為一個字符使用...
擴展
1.在選擇行數時可以使多行,這樣對于加密強度有所提高。2.可以在加密之後在使用其他密碼進行加密,增加強度。
實現的部分源代碼
// 獲取密鑰和明文
String str_p = et_plaintext.getText().toString();
char[] str_p_char = null;
{
try
{
str_p_char = str_p.toCharArray();
}
catch (Exception e) {
System.out.println("Exception");
}
int len=str_p_char.length;
System.out.println("len:"+len);
StringBuffer sb_1 = new StringBuffer();
StringBuffer sb_2 = new StringBuffer();
if(len%2==1)
{
for (int i = 0; i
{
if(i%2==0)
{
sb_1.append(str_p_char[i]);
}
else
{
sb_2.append(str_p_char[i]);
}
}
}
else
{
for (int i = 0; i
{
sb_1.append(str_p_char[i]);
sb_2.append(str_p_char[i+1]);
}
}
str_p = sb_1.toString()+sb_2.toString();
解密部分:
String str_c = et_ciphertext.getText().toString();
char []str_c_char = null;
try
{
str_c_char=str_c.toCharArray();
}
catch(Exception e)
{
System.out.println("Exception");
}
int len=str_c_char.length;
int half=len/2;
StringBuffer sb = new StringBuffer();
if(len%2==1)
{
int i=0;
for (i = 0; i
{
sb.append(str_c_char[i]);
sb.append(str_c_char[i+half+1]);
}
sb.append(str_c_char[half]);
}
else
{
for (int i = 0; i
{
sb.append(str_c_char[i]);
sb.append(str_c_char[i+half]);
}
}
str_c=sb.toString();