java - 使用base64解密文件

时间:2017-07-16 21:00:02

标签: java encryption cryptography base64

在我的项目中,选择了一个文本文件并加密。加密文本与密钥一起保存。现在我尝试创建一个程序,在正确的密钥文件可用时解密文件。我认为解密程序看起来很像DECRYPT_MODE中的加密程序。当我读入密钥时,我不知道如何进行下一步来解密文本文件。也许任何人都可以帮助我如何使用.txt文件中的密钥并使用它来解密编码文件。

加密程序:

public class encrypt {

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
        //Key is created and saved in File
        KeyGenerator keygenerator = KeyGenerator.getInstance("AES");
        SecretKey myDesKey = keygenerator.generateKey();
        String encodedKey = Base64.getEncoder().encodeToString(myDesKey.getEncoded());
        Path keypath = Paths.get("C:/xxx/key.txt");
        Path keyfile = Files.createFile(keypath);
        Files.write(keyfile, encodedKey.getBytes(), StandardOpenOption.WRITE);

        Cipher desalgCipher;
        desalgCipher = Cipher.getInstance("AES");
        desalgCipher.init(Cipher.ENCRYPT_MODE, myDesKey);

        Path target = Paths.get("C:/xxx/encrypted.txt");
        Path file = Files.createFile(target);

        Path path = Paths.get("test.txt");               
        try(InputStream is = Files.newInputStream(path);      
        CipherInputStream cipherIS = new CipherInputStream(is, desalgCipher);   
        BufferedReader reader = new BufferedReader(new InputStreamReader(cipherIS));){  
            String line;
            while((line = reader.readLine()) != null){
                System.out.println(line);
                Files.write(file, line.getBytes(), StandardOpenOption.WRITE);
            }
        }          
    }
}

解密:读入密钥并解密

    public class decrypt {

        public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {

            try {
                File fileDir = new File("C:/Users/JT/Desktop/key.txt");

                BufferedReader in = new BufferedReader(
                   new InputStreamReader(new FileInputStream(fileDir), "UTF-8"));

                String str;

                while ((str = in.readLine()) != null) {
                    System.out.println(str);
                }
                        in.close();
                } 
                catch (UnsupportedEncodingException e) 
                {
                    System.out.println(e.getMessage());
                } 
                catch (IOException e) 
                {
                    System.out.println(e.getMessage());
                }
                catch (Exception e)
                {
                    System.out.println(e.getMessage());
                }

               byte[] decodedKey = Base64.getDecoder().decode(sb.toString());
    SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES"); 
    SecretKeySpec key = new SecretKeySpec(sb.toString().getBytes(), "Base64");

    Cipher desalgCipher;
    desalgCipher = Cipher.getInstance("AES");
    desalgCipher.init(Cipher.DECRYPT_MODE, key);

    Path path = Paths.get("encrypted.txt");                // path to your file
    try(InputStream is = Files.newInputStream(path);        // get an IS on your file
    CipherInputStream cipherIS = new CipherInputStream(is, desalgCipher);   // wraps stream using cipher
    BufferedReader reader = new BufferedReader(new InputStreamReader(cipherIS));){   // init reader.
        String line;
        while((line = reader.readLine()) != null){
            System.out.println(line);

            }
        }

     }
}

1 个答案:

答案 0 :(得分:1)

您的应用程序没有以正确的方式编程。目前,您尝试通过使用CipherInputStream实例包装输入流来加密。然后,此实例再次包含BufferedReader实例。

所以你要做的是首先将输入文件的字节(可能是文本)转换为密文。该密文可以包含任何字节值。然后尝试使用默认字符集和行结尾逐行读取那些字节。很明显,在加密之后,即使行的概念也不再存在,因此您将在最后一步中丢失数据。

然后你转换回字节,然后你以某种方式尝试解密。当您在readLine语句中丢失数据时,这显然会失败。

您应该做的是使用字节读取文件。然后,您可以写入CipherOutputStream。如果带有密文的文件需要是实际文本,您可以使用新Base64很好地提供的java.util.Base64流。

只有在正确编程加密后,您才可以尝试反转该过程。只要数据丢失,解密就会失败(错误或垃圾输出,具体取决于模式和运气)。

如果你不走运,你最终会得到99%的时间都能运行的代码。祝你好运并注意评论:不要在不理解你正在做什么的情况下尝试加密。 以泪水结束 - 或者是一个破碎的键盘。