0

修正された Vigenere 暗号アルゴリズムを作成しましたが、問題が発生しています。を暗号化してStringから復号化すると、元のファイルが返されませんString。私のソースコード:

public class ViganereEncryptionBase64 {

    private char[] keys = new char[19];

    int sizeKey = 0;
    int cimin = 0;

    final String MVEAs = " !\"#$%&'()=+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~";

    public ViganereEncryptionBase64() {
        String keys = "bangdollaMC08ITATS";
        this.keys = keys.toCharArray();
    }

    public String encrypt(String toEncrypt) {
        char charsToEncrypt[] = toEncrypt.toCharArray();
        char encryptedChars[] = toEncrypt.toCharArray();
        int i = 0;
        while (i < encryptedChars.length) {

            int sube = MVEAs.indexOf(charsToEncrypt[i]) + MVEAs.indexOf(keys[sizeKey]) + cimin;

            sizeKey++;
            if (sizeKey == keys.length)
                sizeKey = 0;

            encryptedChars[i] = MVEAs.charAt(Math.floorMod(sube, 95));
            cimin = MVEAs.indexOf(encryptedChars[i]);
            i += 1;
        }
        return String.valueOf(encryptedChars);
    }

    public String decrypt(String toDecrypt) {
        char charsToDecrypt[] = toDecrypt.toCharArray();
        char decryptedChars[] = toDecrypt.toCharArray();
        int i = 0;
        while (i < charsToDecrypt.length) {
            int sube = MVEAs.indexOf(charsToDecrypt[i]) - MVEAs.indexOf(keys[sizeKey]) - cimin;

            sizeKey++;
            if (sizeKey == keys.length)
                sizeKey = 0;
            decryptedChars[i] = MVEAs.charAt(Math.floorMod(sube, 95));
            cimin = MVEAs.indexOf(charsToDecrypt[i]);
            i++;
        }
        return String.valueOf(decryptedChars);
    }
}

この問題を説明する使用例は次のとおりです。

public static void main(String[] args) {
    ViganereEncryptionBase64 viganere = new ViganereEncryptionBase64();
    System.out.println("Result encryption: " + viganere.encrypt("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"));
    viganere = new ViganereEncryptionBase64();
    System.out.println("Result description: " + viganere.decrypt("~at,4X~<Cp|\"(>rdnds~1x_\\XTmN5T{irX-9DZv+opkhJLbT[x7Mk/'J&|p&A0qAMR_yh9|H#\\Y91/kKtQI,Su3Ik, p$@IH.c:Ue'Lj25X L#[3f8ql3U]oF"));
}

元の入力は"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"

その暗号化された結果は"~at,4X~<Cp|\"(>rdnds~1x_\\XTmN5T{irX-9DZv+opkhJLbT[x7Mk/'J&|p&A0qAMR_yh9|H#\\Y91/kKtQI,Su3Ik, p$@IH.c:Ue'Lj25X L#[3f8ql3U]oF"

そして、復号化された結果は"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">"

これは違います。

4

1 に答える 1

2

したがって、暗号化と復号化は完全に機能しています。コードを実行しましたが、テストの入力と出力に違いはありません。

エスケープ シーケンスを必要としない例を使用すると、バックスラッシュ\がエスケープ文字として使用されていることに混乱する可能性があると思います。

public static void main(String[] args) {
    viganere = new ViganereEncryptionBase64();
    System.out.println("Result encryption: " + viganere.encrypt("Hello!"));
    // Which is encrypted to "+R.b7("

    viganere = new ViganereEncryptionBase64();
    System.out.println("Result description: " + viganere.decrypt("+R.b7("));
    // Which is decrypted to "Hello!"
}

完全に機能することがわかります。

あなたの例では、\each の前にa があります"。これは、Java が を終了したと認識しないようにするためです。終了せずに a の途中Stringで使用できることに気付くでしょう。"String

したがって、実際には にはまだ があり、によって印刷されないため、存在しないように見え\ます。これはすべてのエスケープ文字に当てはまります。ユーザーに出力されると、タブや改行などに変換されますStringSystem.out.println

于 2015-07-02T10:16:38.100 に答える