使用FileReader加密文件

时间:2017-07-12 10:19:21

标签: java encryption filereader

在我的java程序中,我想读取一个.txt文件,然后对其进行编码。我知道如何读取文件,并试图学习如何编码数组。我遇到的问题是我不知道如何将它结合起来,它不像我尝试的那样工作。

这是我在文本文件中可以阅读的部分:

public class ReadFile {

    public static void main(String[] args) throws IOException
      {
        FileReader fr = new FileReader("test.txt");
        BufferedReader br = new BufferedReader(fr);

        String zeile = "";

        do
        {
          zeile = br.readLine();
          System.out.println(zeile);
        }
        while (zeile != null);

        br.close();
     }
}

在这部分中,我可以加密和解密字节:

public class Crypt {

    public static void main(String[] args) {

        try{
            KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
            SecretKey myDesKey = keygenerator.generateKey();

            Cipher desalgCipher;
            desalgCipher = Cipher.getInstance("DES");


            byte[] text = "test".getBytes("UTF8");


            desalgCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
            byte[] textEncrypted = desalgCipher.doFinal(text);

            String s = new String(textEncrypted);
            System.out.println(s);

            desalgCipher.init(Cipher.DECRYPT_MODE, myDesKey);
            byte[] textDecrypted = desalgCipher.doFinal(textEncrypted);

            s = new String(textDecrypted);
            System.out.println(s);
        }

            catch(Exception e)
            {
                System.out.println("Error");
            }
    }

}

我想读取文本文件并将其放在一个字符串中进行编码,但我认为这太复杂了。有没有其他方法可以连接它们,还是另一种需要编码的方式?

2 个答案:

答案 0 :(得分:2)

我强烈建议您使用Stream(请参阅https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html& https://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html),而不是直接使用FileReader

加密发生在较低级别(字节数)上,而不是您尝试执行的操作。 Java密码提供方便的CipherInputStream(和CipherOutputStream)来动态加密字节流。它比试图将整个文件转储到单个byte[]中更便宜,更具可扩展性(更多因为您正在解码和重新编码文件内容)。

如果您想要一个使用示例,请查看以下代码段:

public static void encrypt(Path inputFile, OutputStream output) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
    // init cipher
    KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
    SecretKey myDesKey = keygenerator.generateKey();
    Cipher desalgCipher;
    desalgCipher = Cipher.getInstance("DES");
    desalgCipher.init(Cipher.ENCRYPT_MODE, myDesKey);


    try(InputStream is = Files.newInputStream(inputFile);        // get an IS on your file
    CipherInputStream cipherIS = new CipherInputStream(is, desalgCipher)){   // wraps input Stream with cipher
        copyStreams(cipherIS, output);  // copyStream is let to the implementer's choice.
    }
}

我会告诉你如何解密。

编辑:

在不担心编码问题的情况下传递加密字节的常用方法是使用base 64编码原始字节。

您可以使用Base64.getEncoder().wrap(os)

包装outputStream

答案 1 :(得分:2)

FileReader/FileWriter是错误的(旧实用程序)类,因为它们使用当前的平台编码,并且在一台计算机(希腊语Windows)上加密的文件在另一台计算机(Linux服务器)上无法解密。

java中的文本String是Unicode格式。不能(不应该)将任意字节抛出到String中。

因此无法完成以下任务

new String(textEncrypted); // Uses the default platform encoding
new String(textEncrypted, "UTF-8"); // Probably the bytes are not valid UTF-8

所以:

Path path = Paths.get("text.txt");
byte[] content = Files.readAllBytes(path);
content = encrypt(content);
Files.write(path, content);