Java字符反转字节中的问题
我面临着这个奇怪的问题。我使用Java字符反转字节中的问题,java,netbeans,encryption,character-encoding,Java,Netbeans,Encryption,Character Encoding,我面临着这个奇怪的问题。我使用“Character.reverseebytes(char-ch)”方法进行加密。在NetBeans内部运行时,它工作正常。但每当我尝试在外面运行它时,它就会给出奇怪的输出 我认为问题在于,在两种情况下,它使用两种不同的编码方法(或类似的方法)。下面的代码演示了该问题 import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; public class Encryptor
“Character.reverseebytes(char-ch)”
方法进行加密。在NetBeans
内部运行时,它工作正常。但每当我尝试在外面运行它时,它就会给出奇怪的输出
我认为问题在于,在两种情况下,它使用两种不同的编码方法(或类似的方法)。下面的代码演示了该问题
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
public class Encryptor {
public static String encode(String in) {
ArrayList<Character> list = new ArrayList<Character>();
for (int i = 0; i < in.length(); i++) {
list.add(Character.reverseBytes(in.charAt(i)));
}
return arrayToString(list);
}
public static String decode(String in) {
ArrayList<Character> list = new ArrayList<Character>();
for (int i = 0; i < in.length(); i++) {
list.add(Character.reverseBytes(in.charAt(i)));
}
return arrayToString(list);
}
private static String arrayToString(ArrayList<Character> list) {
char[] ch = new char[list.size()];
for (int i = 0; i < list.size(); i++) {
ch[i] = list.get(i);
}
return String.copyValueOf(ch);
}
public static void main(String[] args) throws java.io.FileNotFoundException, java.io.IOException {
String pass = "Password";
String passEn = encode(pass);
File file = new File(System.getProperty("user.dir") + "/pass.txt");
file.createNewFile();
PrintWriter pr = new PrintWriter(file);
pr.write(passEn);
pr.flush();
passEn = new java.util.Scanner(file).next();
String passDe = decode(passEn);
String msg;
msg = "Initial : " + pass
+ "\nEncrypted : " + passEn
+ "\nDecrypted : " + passDe;
javax.swing.JOptionPane.showMessageDialog(null, msg);
}
}
导入java.io.File;
导入java.io.PrintWriter;
导入java.util.ArrayList;
公共类加密机{
公共静态字符串编码(字符串输入){
ArrayList=新建ArrayList();
对于(int i=0;i
首先,我将加密的单词保存到一个文件中,然后尝试解码保存的单词。这在上述两种情况下提供了两种不同的输出
有没有办法解决这个问题?基本上,
Character.reverseBytes
提供了一个任意的UTF-16代码单元。没有任何保证可以保证之后得到的字符将形成有效字符串-例如,可能存在“半”代理项对,或者在Unicode中没有任何特定含义的字符
更重要的是,当您将“文本”写入文件并将其读回时,很有可能会得到不同的值,特别是当您没有指定编码时。您使用的默认编码很可能无法支持您最终使用的字符
基本上,你不想做这些。字符串的加密基本上应采取以下形式:
- 以固定编码(例如UTF-8)将字符串编码为字节
- 加密二进制数据(请不要自己滚动;Java包含大量加密功能)
- 将加密的二进制数据传递到任何需要的地方。如果必须将二进制数据表示为字符串,请使用base64之类的工具确保以后可以恢复准确的二进制数据
- 检索加密的二进制数据,这可能涉及从base64转换回
- 根据之前使用的加密算法执行适当的解密步骤(从二进制到二进制)
- 使用一开始使用的相同编码,将结果(静态字节)转换回字符串
将任意二进制数据视为文本-这实际上就是
字符.reverseBytes
以一种非常粗糙的方式所做的-是一个非常糟糕的主意。您的系统上是否有不同的JRE版本和netbeans使用的版本?您不会在需要任何安全性的真实系统中使用它,对吗?我想我也谈到了同样的问题。@JonSkeet你是说从加密的意义上讲这不是一个好主意,还是因为这是不可能实现的?你能给我一个简单的选择吗。因为我的应用不需要太多的高级安全性。但是我想到了这样的事情,因为我觉得这太容易了。我不想选择太复杂的加密方法..:D但是,好的。任何想法都是受欢迎的。@Anubis:我是说这根本不是加密——破坏它绝对是微不足道的。但是,即使您只想反转每个字符的字节,您也没有以安全的方式处理这些数据。你不再有“真实”的文本了,你不应该把它当作“真实”的文本。更多细节请参见我的答案。有很多简单的加密方法,它们不涉及你自己的滚动。