0

基本的に文字列をバイト配列に変換し、各バイト配列要素を特定の数で「XOR」し、この新しいバイト配列を文字列に変換する暗号化に関する特定の手順が提供されました。

復号化に関しては、復号化された文字列をバイト配列に再変換し、各要素を暗号化で使用された数値と XOR し、新しい復号化された配列を文字列に変換して、最初に使用した正確な文字列を取得します。

残念ながら、最初に使用した文字列を取得できません。たとえば、6,7,8,9,10 を暗号化しようとすると、復号化によって 6,7,8,9,10 ではなく B@722b9406 が返されます。これがなぜそうなのか、何か考えはありますか?

私の暗号化コードは以下のとおりです。

    //Take each array element and do "Exclusive or" with "50" 
public void XORUnencryptedByteArray() {
    System.out.println("\nPART 3:\nXORUnencryptedByteArray() - " + "UnencryptedStringAsByteArray.length IS: " + UnencryptedStringAsByteArray.length);

    byte[] UnencryptedByteArraybyXOR = new byte[UnencryptedStringAsByteArray.length];

    int XOR_Value = 50;

    byte XOR_Value_as_byte = (byte) XOR_Value;

    System.out.println("\nPART 3:\nXORUnencryptedByteArray() - " + "XOR_Value_as_byte IS: " + XOR_Value_as_byte + "\n");

    for ( int j = 0; j < UnencryptedStringAsByteArray.length; j++ ) {

        System.out.println("\nPOSITION " + j + " OF UnencryptedStringAsByteArray[j] CONTAINS: " + UnencryptedStringAsByteArray[j]);

        System.out.println("\n" + UnencryptedStringAsByteArray[j] + " ^ " + XOR_Value_as_byte + " IS: " + (UnencryptedStringAsByteArray[j] ^ XOR_Value_as_byte));

    }

            for (int i = 0; i < UnencryptedByteArraybyXOR.length; i++) { 

                    UnencryptedByteArraybyXOR[i] = (byte) (UnencryptedStringAsByteArray[i] ^ XOR_Value_as_byte);

                System.out.println( "\nPOSITION " + i + " OF UnencryptedByteArraybyXOR[i] IS: " + UnencryptedByteArraybyXOR[i]);    
            }

    //Collect all encrypted array elements and convert the byte array to string
    System.out.println("\nUnencryptedByteArraybyXOR.length IS: " + UnencryptedByteArraybyXOR.length);

    System.out.println("\nUnencryptedByteArraybyXOR.toString() AS STRING IS: " + UnencryptedByteArraybyXOR.toString());

    UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR);

    //System.out.println("\nUnencryptedByteArraybyXORAsString IS: " + UnencryptedByteArraybyXORAsString);   

    WriteStringToFile(UnencryptedByteArraybyXOR.toString());


}

public void WriteStringToFile(String UnencryptedByteArraybyXORAsString) {
        try {
            String str = UnencryptedByteArraybyXORAsString;
            File newTextFile = new File("/Users/anmonari/Desktop/textfile.txt");

            FileWriter fw = new FileWriter(newTextFile);
            fw.write(str);
            fw.close();

        } catch (IOException iox) {
            //do stuff with exception
            iox.printStackTrace();
        }

}

私の復号化コードは以下のとおりです。

 public void XORDecryptedByteArray(byte[] encryptedStringAsByteArray) {

    System.out.println("\nXORencryptedByteArray() - " + "encryptedStringAsByteArray.length IS: " + encryptedStringAsByteArray.length);

    byte[] encryptedByteArraybyXOR = new byte[encryptedStringAsByteArray.length];

    int XOR_Value = 50;

    byte XOR_Value_as_byte = (byte) XOR_Value;

    System.out.println("\nXORencryptedByteArray() - " + "XOR_Value_as_byte IS: " + XOR_Value_as_byte + "\n");

    for ( int j = 0; j < encryptedStringAsByteArray.length; j++ ) {

        System.out.println("\n" + encryptedStringAsByteArray[j] + " ^ " + XOR_Value_as_byte + " IS: " + (encryptedStringAsByteArray[j] ^ XOR_Value_as_byte));

    }

            for (int i = 0; i < encryptedByteArraybyXOR.length; i++) { 

                  encryptedByteArraybyXOR[i] = (byte) (encryptedStringAsByteArray[i] ^ XOR_Value_as_byte);

                  System.out.println("\n" + "POSITION " + i + " OF encryptedByteArraybyXOR[i] CONTAINS: " + encryptedByteArraybyXOR[i]);    
            }

    System.out.println("\ndecryptedByteArraybyXOR.length IS: " + encryptedByteArraybyXOR.length);

    System.out.println("\ndecryptedByteArraybyXOR.toString() AS STRING IS: " + encryptedByteArraybyXOR.toString());

 }

どんな援助も感謝します!!!!!

4

1 に答える 1

3

これが主な問題です。

UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR);

任意のバイナリ データを文字列のように扱っています。そうではありません。実際にエンコードされたバイナリ データではないバイト配列から新しい文字列を作成してはなりません。

任意のバイト配列を文字列に可逆的に変換したい場合は、base64 を使用してください。

さらに、バイト配列を呼び出すだけで出力toStringすると、「B@722b9406」のような値が正確に得られます。これはデータ損失の問題ではなく、配列が文字列に変換される方法にすぎません。Arrays.toString(byte[])より有用な変換を実行するために使用します。

最後に、この「暗号化」を機密性の高いものに使用する予定がないことを願っています。せいぜい難読化です。

于 2013-02-25T15:31:12.157 に答える