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;
}
分享到:
相关推荐
用JAVA语言来编写的VIGENERE 简单易懂
vigenere密码破解.doc
VigenereCipher.java
This is vigenere........
要运行 Vigenere Cipher,您需要输入: java Vigenere "phrase you wish to encode" keywordEXAMPLE: java Vigenere "Run Charlie run" run短语必须在括号中,关键字必须与短语之间用空格分隔。
Java写的信息安全实验报告的Vigenere加解密算法
Vigenere密码是实现 本程序使用java编写
JAVA编程实现的Vigenere加密/解密系统,唯密文破译系统源代码
Vigenere密码的密文字母是用明文字母在Vigenere方阵中的列和密钥字母在Vigenere方阵中的行的交点处的字母来代替的。该C程序实现了了这一简单但值得研究的古典密码。
古典密码Vigenere密码java实现
Vigenere维吉尼亚密码,加密,解密,破译,NetBeansProjects,有页面,密码学课程作业。 利用重合指数破译,明文必须为长篇有意义文章,才能保证有效破译,最大破译密钥长度为n=10,代码中可更改。
vigenere密码的无密钥破解方法c源代码 在没有密钥的情况下破解维吉尼亚密码。
此程序用于实现维吉尼亚算法,用于网络安全中明文的加密和解密操作
Vigenere加密解密C++实现 ,实现了加密和解密的过程。。
可以运行的对文件进行Vigenere加密解密的程序
自己写的凯撒密码和Vigenere算法,很简单
vigenere密码的无密钥破解方法matlab代码
用C++实现Vigenere加密
维吉尼亚无密钥破解,C语言,写的有点混乱,但是能得出明文。(第一次传代码,有更好更简洁的方法我再传0_0)