Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符反转字节中的问题_Java_Netbeans_Encryption_Character Encoding - Fatal编程技术网

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:我是说这根本不是加密——破坏它绝对是微不足道的。但是,即使您只想反转每个字符的字节,您也没有以安全的方式处理这些数据。你不再有“真实”的文本了,你不应该把它当作“真实”的文本。更多细节请参见我的答案。有很多简单的加密方法,它们不涉及你自己的滚动。