1

ようやくプラグインが完成し、別のプロジェクトに取り掛かりました。そのプロジェクトは、暗号化キーと文字列自体を指定して文字列を暗号化する単純なソフトウェアです。それで私はそれを書きました、そしてそれはうまくいっているようですが、それを解読する方法がわかりません。以前は暗号化されたアルファベットの配列を持っていましたが、暗号化関数でそれを使用せずに行う方法を見つけました。復号化でもそれを使用せずに行う方法があるはずです。

私の暗号化機能:

public static String e(String toEncrypt, int encKey) {
    encKey %= ALPHABET.length;
    toEncrypt = toEncrypt.toLowerCase();
    char[] TEChar = toEncrypt.toCharArray();
    for (int i = 0; i < toEncrypt.length(); i++) {
        for (int j = 0; j < ALPHABET.length; j++) {
            if (TEChar[i] == '`') {
                TEChar[i] = '_';
            }
            else if (TEChar[i] == ALPHABET[j]) {
                TEChar[i] = ALPHABET[(j + encKey) % ALPHABET.length];
                break;
            }
        }
    }
    toEncrypt = String.valueOf(TEChar) + "`" + encKey;
    return toEncrypt;
}

ALPHABET (配列、そして私はそれが単なるアルファベット以上のものを含んでいることを認識しています.):

 char[] ALPHABET = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '1',
'2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', ';', ':', '[', ']', '{',
'}', '?'};

オフセット文字を入れるためだけに新しい配列を作成するのではなく、単純な加算と剰余演算子の使用でそれを行いました。減算と同じことを試してみましたが、26 にラップする必要があるためうまくいきませんでした。

4

1 に答える 1

1

これを試して:

public static String e(String toEncrypt, int encKey, boolean addEncKey) {       
    encKey %= ALPHABET.length;
    toEncrypt = toEncrypt.toLowerCase();
    char[] TEChar = toEncrypt.toCharArray();
    for (int i = 0; i < toEncrypt.length(); i++) {
        for (int j = 0; j < ALPHABET.length; j++) {
            if (TEChar[i] == '`') {
                TEChar[i] = '_';
            } else if (TEChar[i] == ALPHABET[j]) {
                TEChar[i] = ALPHABET[(j + encKey + ALPHABET.length)
                        % ALPHABET.length];
                break;
            }
        }
    }
    if (addEncKey) {
        toEncrypt = String.valueOf(TEChar) + "`" + encKey;
    } else {
        toEncrypt = String.valueOf(TEChar);
    }
    return toEncrypt;
}

これは私がそれをテストした方法です:

public static void main(String[] args) {
        String encoded = e("ABDSDfz}", 2, true);
        System.out.println(encoded);
        String decoded = e(
encoded.substring(0, encoded.indexOf("`")),
                -Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
                false);
        System.out.println(decoded);

    }

ご覧のとおり、一部のロジックをメソッド呼び出しに移動しました (次のように、暗号化をラップする復号化関数を簡単に作成できます。

public static String decrypt(String encoded) {
return e(encoded.substring(0, encoded.indexOf("`")),
                    -Integer.parseInt(encoded.substring(encoded.indexOf("`") + 1)),
                    false);
}

復号化と暗号化は基本的に同じように機能しますが、復号化では反対の encKey が使用されます (たとえば、22 の代わりに -22 が使用されます)。これは呼び出しで行われます。'`' 記号の後に encKey を追加します - デコードされたメッセージではそれを望まなかったので、エンコードされた文字列をメソッドに解析するときにそれを切り取り、booleam パラメータ addEncKey を追加して、addEncKey の追加を無効にできるようにしました。コードの次の行も変更しました: TEChar[i] = ALPHABET[(j + encKey + ALPHABET.length) % ALPHABET.length]; これは、encKey が負の場合に発生する可能性のある負のインデックスに対処する簡単な方法です。

于 2012-12-12T18:48:26.747 に答える