`
judeylove
  • 浏览: 16672 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

用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;
    }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics