【问题标题】:java - decrypt a file with base64java - 使用base64解密文件
【发布时间】:2017-07-16 21:00:01
【问题描述】:

在我的项目中,一个文本文件被选中并被加密。加密的文本与密钥一样单独保存。现在我尝试创建一个程序,该程序在正确的密钥文件可用时解密文件。我认为解密程序需要看起来很像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);

            }
        }

     }
}

【问题讨论】:

  • 您实际上应该首先尝试编写解密代码。除非您复制并粘贴加密代码。在这种情况下,这是一个代码请求并且是题外话。不要复制和粘贴安全关键代码。
  • 好的,感谢您的建议,但它对我如何处理密钥没有帮助?
  • 呃……是的,我知道。您还没有尝试编写解密代码?
  • 我编辑了解密部分。读入密钥并选择应解密的文件。但是由于某些原因,我收到了Wrong algorithm: AES or Rinjndael required 的错误。你知道如何避免吗?
  • 你知道base64不是加密算法吧?您无法创建 base64“密钥”,因为没有这样的东西。

标签: java encryption cryptography base64


【解决方案1】:

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

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

然后你转换回字节,然后你(以某种方式)尝试解密。这显然会失败,因为您在 readLine 语句期间丢失了数据。


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

只有正确编程加密后,您才能尝试逆转该过程。只要数据明显丢失,解密就会失败(有错误或垃圾输出,取决于模式和你的运气)。


如果你运气不好,你最终会得到 99% 的代码。祝你好运并注意 cmets:不要在不了解您在做什么的情况下尝试执行加密。它以泪水结束 - 或者键盘被打碎。

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2020-06-05
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多