栅栏密码

栅栏密码

解码技术
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)
    中文名:栅栏密码 外文名:The rail fence cipher 性质:密码 领域:加密学

解释

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

相关词条

相关搜索

其它词条