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

[code]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;
}

[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值