1

Vigenere暗号でエンコードするJavaプログラムを作成しましたが、暗号化は正常に機能しますが、一部の特殊なケースでは復号化は機能しません。

たとえば、プレーン テキストが 'k' でキーが 'y' の場合、暗号化テキスト 'i' ((10 + 24 = 34 % 26 = 8)) が正しく生成されます。

ただし、暗号テキストを復号化すると「i」でキーが「y」の場合、((8-24) =-16%26 = -16)) が得られます。これは正の場合でも Q になります。正しく復号化する必要がある場合10になる「k」に戻ります。

誰か助けてくれませんか?必要に応じて、さらにコードを投稿できます。

---ウィキへのリンク Viginare 暗号アルゴリズムhttp://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher ---

        //decryption
    else{
        for (int i=0; i < a.length(); i++){

                for (int j=0; j < full.length(); j++){
                    //finding the index of the current cipher text letter
                    if (a.charAt(i) == full.charAt(j)){
                        positionP = j;

                    }
                    //finding the index of the current key letter
                    if(key.charAt(i)==full.charAt(j)){
                        positionK = j;
                    }


                }
                //using the formula for vigenere encoding it adds the newly encrypted character to the output
                output = output + full.charAt((positionP - positionK)%26);
            }
        }
4

2 に答える 2

3

Java の剰余演算子は、結果の大きさが常に除数の大きさより小さく、被除数が負の場合は剰余演算の結果が負になるように定義されていることに注意してください [JLS]

次のようにして、目的の出力を取得できます。

 output = output + full.charAt((positionP - positionK + 26)%26);

が正の場合positionP-positionK、加算によって結果は変わりません (26%26=0 のため)。が負の場合positionP-positionK(-25 から 0 の間)、positionP - positionK + 26正の値になり、正しい結果が得られます。

于 2013-02-24T18:45:12.500 に答える
1

キーが 'y'=24 で、アルファベットの長さが 26 の場合、復号化するには、alphabet-key= 26 - 24 = 2 をシフトする必要があります。常に mod 26 を加算してから計算する必要があります。

だからあなたのコードは

       //decryption
else{
    for (int i=0; i < a.length(); i++){

            for (int j=0; j < full.length(); j++){
                //finding the index of the current cipher text letter
                if (a.charAt(i) == full.charAt(j)){
                    positionP = j;

                }
                //finding the index of the current key letter
                if(key.charAt(i)==full.charAt(j)){
                    positionK = j;
                }


            }
            //using the formula for vigenere encoding it adds the newly encrypted character to the output
            output = output + full.charAt((positionP + (26-positionK))%26);
        }
    }
于 2013-02-24T18:48:10.123 に答える