维基利亚解密java编写

import java.util.ArrayList;

public class Vegenere {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String encrypt = "OCWYIKOOONIWUGPMXWKTZDWGTSSAYJZWY"
                + "EMDLBNQAAAVSUWDVBRFLAUPLOOUBFGQHGCSCMGZL"
                + "ATOEDCSDEIDPBHTMUOVPIEKIFPIMFNOAMVLPQFXE"
                + "JSMXMPGKCCAYKWFZPYUAVTELWHRHMWKBBNGTGUVT"
                + "EFJLODFEFKVPXSGRSORVGTAJBSAUHZRZALKWUOWH"
                + "GEDEFNSWMRCIWCPAAAVOGPDNFPKTDBALSISURLNP"
                + "SJYEATCUCEESOHHDARKHWOTIKBROQRDFMZGHGUCE"
                + "BVGWCDQXGPBGQWLPBDAYLOOQDMUHBDQGMYWEUIK";
        ArrayList<String> theEncrypt = new ArrayList();
        ArrayList<String> Key,answer;
        for(int i = 0;i<encrypt.length();i++)
        {
            theEncrypt.add(String.valueOf(encrypt.charAt(i)));
        }
        
        Encrypt en = new Encrypt(theEncrypt);
        Key = en.ShowKey();
        answer = en.ShowAnswer();
        en.DoEncrypt();    
        System.out.println(Key);
        System.out.println(en.keyLength);
        System.out.println(answer);
    }

}
import java.util.ArrayList;
import java.lang.*;
public class Encrypt {
    ArrayList<String> key = new ArrayList();
    int keyLength;//密钥长度
    double[] keyProbability = {0.082,0.015,0.028,0.042,
            0.127,0.022,0.020,0.061,0.070,0.001,0.008,
            0.040,0.024,0.068,0.075,0.019,0.001,0.060,
            0.063,0.090,0.028,0.010,0.024,0.020,0.001
            ,0.001};
    double[] theKeyProbability = new double[26];
    ArrayList<String> theEncrypt; //密文 
    ArrayList<String> theEncrypt2; //用于计算重合指数的密文2
    ArrayList<String> answer = new ArrayList();
    //构造函数
    public Encrypt(ArrayList<String> theEncrypt){
        this.theEncrypt = theEncrypt;
        theEncrypt2= new ArrayList<>(theEncrypt);
    }
    
    //解密
    public ArrayList<String> DoEncrypt(){
        int likeNumber=0,likeNumberBuffer=0;
        int firstnumber = 6;
        
        //确定密匙长度
        for(int i=firstnumber;i<theEncrypt.size();i++){
            likeNumberBuffer=0;
            i=firstnumber;
            //int i=7;
            for(int j =0 ;i<theEncrypt.size();j++,i++){
                if(theEncrypt.get(i).equals(theEncrypt2.get(j)))
                {
                    
                    likeNumberBuffer++;
                }
            }            
            if(likeNumber<likeNumberBuffer)
            {    
                likeNumber=likeNumberBuffer;
                keyLength = firstnumber;
            }
            firstnumber++;
        }
        return theEncrypt;
    }
    
    //确定密钥值
    public ArrayList<String> ShowKey()
    {
        
        for(int i=0;i<6;i++){
            int[] a= {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 sumNumber=0.0;
            //if(theEncrypt.get(i).equals(theEncrypt2.get(j)))
            for(int j=i;j<theEncrypt.size();j = j+6)
            {
                switch (theEncrypt.get(j)){
                case "A":a[0]++;break;
                case "B":a[1]++;break;
                case "C":a[2]++;break;
                case "D":a[3]++;break;
                case "E":a[4]++;break;
                case "F":a[5]++;break;
                case "G":a[6]++;break;
                case "H":a[7]++;break;
                case "I":a[8]++;break;
                case "J":a[9]++;break;
                case "K":a[10]++;break;
                case "L":a[11]++;break;
                case "M":a[12]++;break;
                case "N":a[13]++;break;
                case "O":a[14]++;break;
                case "P":a[15]++;break;
                case "Q":a[16]++;break;
                case "R":a[17]++;break;
                case "S":a[18]++;break;
                case "T":a[19]++;break;
                case "U":a[20]++;break;
                case "V":a[21]++;break;
                case "W":a[22]++;break;
                case "X":a[23]++;break;
                case "Y":a[24]++;break;
                case "Z":a[25]++;break;
                }
            }
            for(int n=0;n<26;n++)
            {
                sumNumber = sumNumber+a[n];
            }
            for(int n=0;n<26;n++)
            {
                theKeyProbability[n] = a[n]/sumNumber;
            }
            
            
            int  min = 0;
            double minChongHeZhiShu = 0.0;
            for( int j = 0;j<26;j++)
            {
                double chongHeZhiShu = 0.0;
                
                for(int n = 0;n<26;n++)
                {
                    chongHeZhiShu = chongHeZhiShu +keyProbability[Math.floorMod((n+j),26)]*theKeyProbability[n];
                }
                
                //选择重合指数最接近0.065的偏移量
                if(Math.abs(minChongHeZhiShu-0.065)>Math.abs(chongHeZhiShu-0.065))
                {
                    minChongHeZhiShu = chongHeZhiShu;
                    min = j;
                }
            }
            key.add(String.valueOf((char)('a'+(int)(26-min))));//26-min是为了返回平移量的模,此时的偏移量才是真的偏移量
        }
        return key;
    }
    
    //返回解密结果
    public ArrayList<String> ShowAnswer()
    {
        for(int i = 0;i<theEncrypt.size();i++)
        {
            int a = Math.floorMod(theEncrypt.get(i).charAt(0)+32-key.get(Math.floorMod(i, 6)).charAt(0), 26);
            char b = (char)(a+'a');    
            answer.add(String.valueOf(b));
        }
        
        return answer;
        
    }
    
}

 

posted @ 2018-03-20 20:45  little——boy  阅读(1085)  评论(0编辑  收藏  举报