-2

Java内で、5〜15の間の特定の長さで、vigenere-cipherのキーの長さを推測する小さなプログラムを作成しています。転置のため、標準偏差を計算することでこれを行います。しかし、私の本当の質問は、メソッド「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;
}

}

4

1 に答える 1

0

私は暗号フリークではありませんが、あなたのコードを調べて例外を見ました。あなたの問題は、技術的というよりもドメイン固有の問題だと思います...

countFrequency() のネストされた for ループでは、配列 splittedText に少なくとも 15 個の要素が含まれている必要があります。

  • 1) の場合、splitSize は 5 から 14 までです。
  • for 2) すべての splitSize に対して、j は 0 から splitSize まで実行されます
  • for 3) すべての j に対して、splittedText の j 番目の要素で何かを行う

最後の for は、例外にとって重要です。

splittedText には、少なくとも 15 個の要素が含まれている必要があります。

splittedText にはいくつの要素がありますか?

これは、splitText(int, String) で決定されます。このメソッドは、現在の splitSize を partLength として、ユーザー入力を encryptedText として (1 に対して) 呼び出されます。splitText は (encryptedText.length() / partlength) 要素の配列を返します。したがって、次のようになります。

splittedText.length() = (inputlength / splitSize)

すべての splitSize (5 ~ 14) について、input-length は次の条件を保持する必要があります。

入力長/splitSize >= splitSize ; これは

入力の長さ >= splitSize * splitSize

splitSize が 14 の場合、入力は 196 より大きくなければなりません。

私が読んだ限りでは、これは vigenere-cipher の制約ではありません。そして - ところで - この最初の ArrayOutOfBoundException を渡すと、次の例外が発生します。

于 2014-09-18T14:59:58.887 に答える