我已经提供了有关加密的具体步骤,它实质上是将字符串转换为字节数组,并使用特定数字“异或”每个字节数组元素,并将此新字节数组转换为字符串。
至于解密我要将解密后的字符串重新转换为字节数组,将每个元素与加密中使用的数字进行异或,并将新解密的数组转换为字符串,以便为我提供我开头的确切字符串
不幸的是我无法获得我开始使用的字符串,例如当我尝试加密6,7,8,9,10时,解密返回B @ 722b9406而不是6,7,8,9,10。任何想法为什么会这样?
我的ENCRYPTION代码如下:
//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();
}
}
我的DECRYPTION代码如下:
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());
}
任何帮助都得到了赞赏!!!!!
答案 0 :(得分:3)
这是主要问题:
UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR);
您将任意二进制数据视为字符串。不是。您不得从字节数组创建新字符串,该字符数组不是实际编码的二进制数据。
如果您真的想以可逆方式将任意字节数组转换为字符串,请使用base64。
此外,当您通过调用toString
打印出一个字节数组时,您将获得一个完整的值,例如“B @ 722b9406”。这不是数据丢失的问题 - 它只是数组转换为字符串的方式。使用Arrays.toString(byte[])
执行更有用的转化。
最后,我希望你没有计划对任何敏感的东西使用这种“加密” - 它充其量是混淆。