浏览 1920 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-13
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; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |