2

それは知らない人のためのシーザーズボックス暗号化です

public class CaesarBox {

public static void main(String[] args) {
    // CaesarsBox <-encrypt|-decrypt>
    if (args[0].equals("-encrypt")) {
        System.out.println(encrypt(args[1]));
    } else if (args[0].equals("-decrypt")) {
        System.out.println(decrypt(args[1]));
    }
}

public static String encrypt(String plaintext) {
    // TODO put encryption code below this line
    plaintext = plaintext.replaceAll("\\s+", "");// removes white space
    plaintext = plaintext.toLowerCase();// converts capitol letters to lower
    // case

    char[] charArray = plaintext.toCharArray();
    // takes individual characters from the arguments and puts them into an
    // array

    int x = charArray.length; // assigns the length of charArray to x
    int y = 0;
    while (y < x) {
        ++y;
        if ((y == Math.floor(y)) && y * y >= x) {
        // tests if y is an integer
        // increases y until it is an integer
            break;
        }// above code finds the the length of the sides of the box
    }
    char[][] box = new char[y][y];// creates a 2d array
    int pos = 0;
    for (int i = 0; i < box.length; i++) {
        for (int j = 0; j < box[i].length; j++) {
            if (pos < plaintext.length()) {
                box[i][j] = plaintext.charAt(pos);
                pos++;
            // fills the array with the characters from the text to be
            // encrypted
            }
        } 
    }
    String encrypted = "";
    for (int i = 0; i < box.length; i++) {
        for (int j = 0; j < box.length; j++) {
            if (box[j][i] != 0) {// tells the program to ignore null values
                encrypted += box[j][i];
            }
            // prints out the letters in the box by column
        }

    }
    return encrypted;

// Put encryption code above this line

}

public static String decrypt(String cyphertext) {
    // TODO put decryption code below this line
    cyphertext = cyphertext.replaceAll("\\s+", "");// removes white space
    cyphertext = cyphertext.toLowerCase();// converts capitol letters to lower case

    char[] charArray = cyphertext.toCharArray();
    // takes individual characters from the arguments and puts them into an
    // array

    int x = charArray.length; // assigns the length of charArray to x
    int y = 0;
   while (y < x) {
        ++y;
        if ((y == Math.floor(y)) && y * y >= x) {
            // tests if y is an integer
            // increases y until it is an integer
            break;
        }// above code finds the the length of the sides of the box
    }
    char[][] box = new char[y][y];// creates a 2d array
    int pos = 0;
    for (int i = 0; i < box.length; i++) {
        for (int j = 0; j < box[i].length; j++) {
            if (pos < cyphertext.length()) {
                box[i][j] = cyphertext.charAt(pos);
                pos++;
            }
        }
        // fills the array with the characters from the text to be
        // encrypted
    }
    String decrypted = "";
    for (int i = 0; i < box.length; i++) {
        for (int j = 0; j < box[i].length; j++) {
            if (box[j][i] != 0) {// tells the program to ignore null values
                decrypted += box[j][i];
                // prints out the letters in the box by column
            }

        }
    }

    return decrypted;
    // Put decryption code above this line
    }

}

これまでのところ私のコードです。私が抱えている問題は、完全な正方形ではないものを解読することです。解決策は、配列の適切な場所にスペースを入れることと関係があることは知っていますが、その方法がわかりません。どんな助けでも素晴らしいでしょう! :) 何か説明が必要な場合は、お知らせください。

4

2 に答える 2

0

Caesar box について私が見つけたのは、文字の総数の合計が完全な 2 乗でなければならないということです。コードで 25 文字のメッセージを試すと、問題なく動作します。

The password is Bee ring twice

メッセージをエンコード:

tsdethsirwewsiipobncarege

デコードされたメッセージ:

thepasswordisbeeringtwice

メッセージを完全な 2 乗の文字数に拡大するには、ボックスの空のスペースに文字を追加できます。次に例を示します。

for (int i = 0; i < box.length; i++) 
{
    for (int j = 0; j < box[i].length; j++) 
    {
        if (pos < plaintext.length()) 
        {
            box[i][j] = plaintext.charAt(pos);
            pos++;
        // fills the array with the characters from the text to be
        // encrypted
        }
        else 
            box[i][j] = 0;
    }
}

encriptes 文字列の構造を変更し、0 を含めることができるようにします。

 for (int i = 0; i < box.length; i++) 
{
    for (int j = 0; j < box.length; j++) 
    { 
            encrypted += box[j][i];
        // prints out the letters in the box by column
    }

}
于 2013-04-14T13:53:56.447 に答える