我正在制作一个小程序来猜测vigenere-cipher的密钥长度,在java中给定长度在5-15之间。 我这样做是因为换位而计算标准偏差。 但我真正的问题是为什么我在方法“countFrequency”中得到数组中的出界错误。我似乎无法看到它超出界限。
我知道我的程序可能更有效率,但我认为一旦修复此错误就应该可行。 我的程序代码如下。
谢谢!
import java.awt.List;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class main {
// Scanning the encrypted text
// private static char encryptedText[];
public static void main(String[] args) throws IOException{
Scanner scan = null;new Scanner(System.in);
scan = new Scanner(System.in);
int i;
int vectors[][];
System.out.println("Give the decrypted text: \n");
String encryptedText = scan.next().toString();
vectors = makeArray();
vectors = countFrequency(vectors, encryptedText);
calculateDeviations(vectors);
// No need to scan more
if(scan!=null)
scan.close();
}
private static void calculateDeviations(int[][] vectors) {
int i;
int j;
int sumpowfreq;
int freqpowsum;
for(i=0;i<12;i++){
double deviation =0;
for(j=0; j<26;j++){
sumpowfreq = sumPowwFreq(vectors,i);
freqpowsum = freqPowwSum(vectors,i);
deviation = Math.sqrt((sumpowfreq/26) - (freqpowsum/26));
}
System.out.println("The devation of " + j + " is " + deviation + ".");
}
}
private static int freqPowwSum(int[][] vectors, int i) {
int powsum=0;
int sum=0;
int j;
for(j=0;j<26;j++){
sum = sum + vectors[j][i];
}
powsum = sum * sum;
return powsum;
}
public static int sumPowwFreq(int[][] vectors, int i) {
int sum=0;
int j;
for(j=0;j<26;j++){
sum = sum + (vectors[j][i] * vectors[j][i]);
}
return sum;
}
public static int[][] makeArray() {
// Making the 2-dimensional array and set it to 0
int keySize;
int letterFrequency[][] = new int[26][11];
for(keySize=5;keySize<16;keySize++){
int j;
for(j=0;j<26;j++){
letterFrequency[j][keySize-5] = 0;
}
}
return letterFrequency;
}
public static int[][] countFrequency(int freq[][], String encryptedText){
int i,j,c;
int splitSize;
int ascii;
String splittedText[];
for(splitSize=5; splitSize<15; splitSize++){
splittedText = splitText(splitSize, encryptedText);
for(j=0;j<splitSize;j++){
for(c=0;c<splittedText[j].length();c++){
ascii= splittedText[j].charAt(c);
ascii = ascii - 97; // because the ascii table starts at 97, 0 represents an 'a' now
// and we assumed that the encrypted text only contained small letters
freq[ascii][j]++;
}
}
}
return freq;
}
public static String[] splitText(int partLength, String encryptedText){
int len = encryptedText.length();
int amountparts = len / (partLength);
String parts[] = new String[amountparts];
// Break into parts
int offset= 0;
int i = 0;
while (i < amountparts){
parts[i] = encryptedText.substring(offset, Math.min(offset + partLength, len));
offset += partLength;
i++;
}
return parts;
}
}
答案 0 :(得分:0)
我不是加密,但我进入你的代码并看到异常。 我认为,你的问题相当于特定领域而不是技术......
countFrequency()中的嵌套for循环要求数组splittedText包含至少15个元素。
最后一个对于例外非常重要:
splittedText必须包含至少15个元素。
splittedText中有多少个元素?
这是在splitText(int,String)中确定的。在(for 1)中调用此方法,当前splitSize为partLength,用户输入为encryptedText。 splitText返回一个包含(encryptedText.length()/ partlength)元素的数组。所以我们有:
splittedText.length()=(inputlength / splitSize)
对于每个splitSize(5到14),输入长度必须符合以下条件:
input-length / splitSize&gt; = splitSize;这相当于
input-length&gt; = splitSize * splitSize
对于splitSize为14,您的输入必须大于196.
据我所知,这不是vigenere-ciphers的约束。并且 - 顺便说一句 - 如果你传递第一个ArrayOutOfBoundException,你将遇到下一个异常。