有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

加密Java使用XOR解密的字符串不生成原始/加密字符串

我得到了关于加密的具体步骤,基本上是将字符串转换为字节数组,用特定的数字“XORing”每个字节数组元素,并将这个新的字节数组转换为字符串

至于解密,我要将解密后的字符串重新转换为字节数组,将每个元素与加密中使用的数字进行异或,然后将新解密的数组转换为字符串,得到我开始使用的字符串

不幸的是,我无法获取我开始使用的字符串,例如,当我尝试加密6,7,8,9,10时,解密返回B@722b9406不是6,7,8,9,10。你知道为什么会这样吗

我的加密代码如下:

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

 }

感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    这是主要问题:

    UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR);
    

    将任意二进制数据视为字符串。不是。不能从字节数组中创建一个新字符串,该字节数组实际上不是编码的二进制数据

    如果您真的想以可逆的方式将任意字节数组转换为字符串,请使用base64

    此外,当您通过调用toString来打印字节数组时,您将得到一个值,例如“B@722b9406“。这不是数据丢失的问题——这只是数组转换为字符串的方式。使用^{}执行更有用的转换

    最后,我希望你没有打算对任何敏感的东西使用这种“加密”——这充其量只是一种模糊处理