解释
一般比较常见的是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();