首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

用JAVA写的一个破译Vigenere的程序,运行成功,但是没有结果.不知道为什么.

2011-12-25 
用JAVA写的一个破解Vigenere的程序,运行成功,但是没有结果.不知道为什么....Exceptioninthreadmain java

用JAVA写的一个破解Vigenere的程序,运行成功,但是没有结果.不知道为什么....
Exception   in   thread   "main "   java.lang.ArrayIndexOutOfBoundsException:   6
                at   Vigenere.figureOutKeyLength(DecoderAndEncoder.java:74)
                at   DecoderAndEncoder.main(DecoderAndEncoder.java:38)
Java   Result:   1
debug-single:
生成成功(总时间:1   秒)

import   java.util.*;
import   java.text.*;
public   class   DecoderAndEncoder   {
       
        /**   Creates   a   new   instance   of   DecoderAndEncoder   */
        public   static   void   main(String[]   args)
        {
                  String   originalCode= "hdsfgvmkoowafweetcmfthskucaqbil "   +
                                "gjofmaqlgspvatvxqbiryscpcfrmvswrvnqlszdmgao "   +
                                "qsakmlupsqforvtwvdfcjzvgsoaoqsacjkbrsevbelv "   +
                                "bksarlscdcaarmnvrysywxqgvellcyluwwveoafgcla "   +
                                "zowafojdlhssfiksepsoywxafowlbfcsocylngqsyzx "   +
                                "gjbmlvgrggokgfgmhlmejabsjvgmlnrvqzcrggcrghg "   +
                                "eupcyfgtydycjkhqluhgxgzovqswpdvbwsffsenbxap "   +
                                "asgazmyuhgsfhmftayjxmwznrsofrsoaopgauaaarmf "   +
                                "tqsmahvqecev ";//要破译的密文
                int[]   statu=new   int[6];
              Vigenere   myCode=new   Vigenere(originalCode);
                for(int   i=0;i <6;i++)
                {
                        String   temp=myCode.moveLeft(i);
                        statu[i]=myCode.compareIt(originalCode,temp);
                       
                }
                keyLength=myCode.figureOutKeyLength(statu);//報錯說這一行也有錯誤
                int[]   key=new   int[keyLength];
                for(int   j=0;j <keyLength;j++)
                {
                        key[j]=myCode.findKey(j,keyLength);


                }
                String   enCode=myCode.deCoder(key,keyLength);
                System.out.println( "解密后的明文为: ");
                System.out.println(enCode);
        }
        private   static   int   keyLength;      
}
class   Vigenere{
                public   Vigenere(String   s)
                {
                        oril=s;
                }
                public   String   moveLeft(int   k)
                {
                        String   str=oril.substring(k,oril.length());
                        return   str;
                }
                public   int   compareIt(String   m,String   n)
                {
                        int   p=0;
                        for(int   q=0;q <n.length();q++)
                        {
                                if(m.charAt(q)==n.charAt(q))   p++;
                        }
                        return   p;
                }
                public   int   figureOutKeyLength(int[]   t)
                {
                        int   u=0;
                        for(int   r=0;r <t.length;r++)
                        {
                                if(t[r]> t[r+1])   u=r;//報錯說這一行有錯誤
                                else   u=r+1;
                        }
                        return   u;
                }
                public   int   findKey(int   v,int   z)
                {
                        double[][]   A=new   double[26][26];


                        A[0]=new   double[]{0.082,0.015,0.028,0.043,0.0127,0.022,0.020,0.061,0.070,
                                                        0.002,0.008,   0.040,0.024,0.067,0.075,0.019,0.001,0.060,
                                                        0.063,0.091,0.028   ,0.010,
                                                        0.023   ,0.001,0.020,0.001};
                        for(int   c=0;c <26;c++)
                        {
                                for(int   d=1;d <26;d++)
                                        A[c+1][d-1]=A[c][d];
                                A[c+1][25]=A[c][0];
                        }
                       
                        int[]   V=new   int[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
                        double[]   W=new   double[26];
                                int   g=0;
                                  String   alphaBeta= "abcdefghijklmnopqrstuvwxyz ";
                                for(int   j=0;j <26;j++)
                                   
                                for(g=v;g <oril.length();g+=z)
                                {
                                      if(oril.charAt(g)==alphaBeta.charAt(j))
                                              V[j]++;
                                             
                                }
                        for(int   h=0;h <26;h++)


                        {
                                W[h]=V[h]/g;
                               
                        }
                      double[]   WA=new   double[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
                      for(int   k=0;k <26;k++)
                      {
                              for(int   n=0;n <26;n++)
                                      WA[k]+=A[k][n]*W[n];
                      }
                      int   key=0;
                      for(int   i=0;i <26;i++)
                      {
                              if(WA[i]> WA[i+1])   key=i;
                              else   key=i+1;
                      }
                      return   key;
                     
                   
                       
                }
                public   String   deCoder(int[]   key,int   keyLength)
                {
                        String   enCode= " ";
                        char   s;
                        for(int   i=0;i <oril.length();i++)
                        {       char   c=oril.charAt(i);
                                c+=(key[i%keyLength]);
                                s=(char)c;
                                enCode+=s;
                        }
                        return   enCode;
                }


              private   String   oril;
        }

[解决办法]
r = t.length-1的时候
r+1 = t.length
t[r+1]的话当然数组越界...
[解决办法]
应该是数组越界的问题吧,不清楚........

热点排行