Java - 使用 XOR 解密的字符串不产生原始/加密字符串
Posted
技术标签:
【中文标题】Java - 使用 XOR 解密的字符串不产生原始/加密字符串【英文标题】:Java - Decrypted string using XOR not producing original/encrypted string 【发布时间】:2013-02-25 15:28:05 【问题描述】:我已经获得了有关加密的具体步骤,本质上是将字符串转换为字节数组,并将每个字节数组元素与特定数字“异或”,并将这个新的字节数组转换为字符串。
至于解密,我要将解密的字符串重新转换为字节数组,将每个元素与加密中使用的数字进行异或运算,然后将新的解密数组转换为字符串,以提供我开始时使用的确切字符串.
不幸的是,我无法获得我开始使用的字符串,例如当我尝试加密 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());
感谢任何帮助!!!!!
【问题讨论】:
您是否有理由不只是使用KeyCzar 来满足您的加密需求? 【参考方案1】:这是主要问题:
UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR);
您将任意二进制数据视为字符串。它不是。您不得从不是实际上编码的二进制数据的字节数组创建一个新字符串。
如果您真的想以可逆方式将任意字节数组转换为字符串,请使用 base64。
此外,当您通过调用toString
打印出一个字节数组时,您将得到一个准确的值,例如“B@722b9406”。这不是数据丢失的问题——这只是数组转换为字符串的方式。使用Arrays.toString(byte[])
执行更有用的转换。
最后,我希望您不打算将这种“加密”用于任何敏感信息 - 充其量只是混淆。
【讨论】:
很高兴看到可敬的 Jon Skeet 有时也在与方法的链接编码作斗争:) 当然是 +1 @owlstead:在我按下 Ctrl-L 之前很好 :)以上是关于Java - 使用 XOR 解密的字符串不产生原始/加密字符串的主要内容,如果未能解决你的问题,请参考以下文章