0

I've been provided with specific steps regarding encryption which is essentially converting a string to a byte array and "XORing" each byte array element with a specific number and converting this new byte array to a string.

As for the decryption I'm to reconvert the decrypted string into a byte array, take each element XOR this with the number used in the encryption and convert the new decrypted array to a string to give me the exact string i started with.

Unfortunately I'm unable to do obtain the string I started with e.g. when i attempt encrypting 6,7,8,9,10 the decryption returns B@722b9406 not 6,7,8,9,10. Any ideas why this is so?

My ENCRYPTION CODE is below:

    //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();
        }

}

my DECRYPTION code is below:

 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());

 }

ANY ASSISTANCE IS APPRECIATED !!!!!

1
  • Is there a reason that you're not just using KeyCzar for your crypto needs? Commented Feb 25, 2013 at 15:29

1 Answer 1

3

This is the main problem:

UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR);

You're treating a arbitrary binary data as if it were a string. It's not. You must not create a new string from a byte array which isn't actually encoded binary data.

If you really want to convert an arbitrary byte array to a string in a reversible manner, use base64.

Additionally, when you print out a byte array by just calling toString on it, you'll get exactly a value such as "B@722b9406". That's not a matter of data loss - it's just the way that arrays are converted to strings. Use Arrays.toString(byte[]) to perform a more useful conversion.

Finally, I hope you weren't planning on using this "encryption" for anything sensitive - it's obfuscation at best.

Sign up to request clarification or add additional context in comments.

2 Comments

Glad to see the venerable Jon Skeet struggle with the link encoding of methods too sometimes :) +1 of course
@owlstead: It was fine before I hit Ctrl-L :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.