Java,使用我的自定义密码进行编码

时间:2018-06-19 12:23:44

标签: java encryption memory-management

我有一个程序可以使用我的自定义密码,文本文件和无损媒体文件进行编码和解码,但是问题是超过2MB的文件会崩溃。

void doTheRabi(File f, byte[] hashedPass) {
    try {
        // BufferedReader br = new BufferedReader(new InputStreamReader(new
        // FileInputStream(f))); // legge il file
        // String response = new
        // String(Files.readAllBytes(Paths.get(f.getAbsolutePath()))); // scrive tutto
        // il file in memoria
        FileReader fr = new FileReader(f);
        BufferedReader br = new BufferedReader(fr);
        String response = new String(); // ASSEGNO IL CONTENUTO DEL FILE IN QUESTA STRINGA
        for (String line; (line = br.readLine()) != null; response += line + "\n")
            ;
        response = response.replace("\n", "newline").replace("\r", "newrow"); // rimpiazzo le new line con "newline"
                                                                                // e "newrow"
        byte[] encodedfile = response.getBytes(StandardCharsets.UTF_8); // trasformo il file in byte
        byte[] result = new byte[encodedfile.length]; // variabile temporanea
        int hpc = 0;
        for (int i = 0; i < result.length; i++) {
            result[i] = (byte) (encodedfile[i] + hashedPass[hpc++]); // algoritmo rabi
            if (hpc == hashedPass.length) {
                hpc = 0;
            }
        }
        String encodedresult = Base64.getEncoder().encodeToString(result); // restituisco il risultato in base64
        FileWriter fw = new FileWriter(f);
        PrintWriter pw = new PrintWriter(fw);
        pw.print("");
        pw.append(encodedresult /* + "extension=" + extString */); // scrivo nel file tutto il risultato
        pw.flush();
        pw.close();
        fw.close();
        br.close();
        String path = f.getAbsolutePath();
        String newName = path + ".rab1";
        f.renameTo(new File(newName));
    } catch (Exception e) {
        console.appendText("Error: " + e.getMessage() + "\n");
        e.printStackTrace();
    }
}

// operazione inversa
void killTheRabi(File f, byte[] hashedPass) {
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
        String response = new String();
        for (String line; (line = br.readLine()) != null; response += line)
            ;
        byte[] decodedfile = Base64.getDecoder().decode(response);
        byte[] result = new byte[decodedfile.length];
        int hpc = 0;
        for (int i = 0; i < result.length; i++) {
            result[i] = (byte) (decodedfile[i] - hashedPass[hpc++]);
            if (hpc == hashedPass.length) {
                hpc = 0;
            }
        }
        String resultString = bytesToString(result);
        String finalres = resultString.replace("newline", "\n").replace("newrow", "\r");
        FileWriter fw = new FileWriter(f);
        PrintWriter pw = new PrintWriter(fw);
        pw.print("");
        pw.append(finalres);
        pw.flush();
        pw.close();
        fw.close();
        br.close();
        String path = f.getAbsolutePath();
        String newName = path.replace(".rab1", "");
        f.renameTo(new File(newName));
    } catch (Exception e) {
        console.appendText("Error: " + e.getMessage() + "\n");
        e.printStackTrace();
    }
}

我在做什么错?我认为这是因为内存已满,因为Java使用了虚拟机,但是我不知道一种提高内存使用率的方法,也许使用缓冲区,但是我还没有使用它们吗?

1 个答案:

答案 0 :(得分:0)

由于您可能在内存中保存了大量数据,请尝试以下操作: 从参数-Xmx2048m或更多开始,增加JVM使用的最大堆大小