0

我相信我这样做是对的。我如何看待使用 RSA 解密文件:

  1. 读入文件的每一行作为String
  2. cipher.init(Cipher.DECRYPT_MODE, privateKey)
  3. 将字符串转换为char[]使用Hex.decodeHex(String.toCharArray())
  4. 最后做cipher.doFinal(x)

这听起来对吗?我正在这样做,但它不起作用,DecryptedFile.txt只是 2 行“null”。

我可以使用几乎完全相同的过程进行加密,但cipher.init(Cipher.ENCRYPT_MODE, publicKey)很明显。

这是我的代码

try {
        BufferedReader inStream = new BufferedReader (new FileReader(cryptoFile));

        int k = 0;

        fileContents.add(inStream.readLine());

        while(fileContents.get(k) != null) {
            k++;
            fileContents.add(inStream.readLine());
        }

        inStream.close();

        try {

            PrivateKey privateKey = kp.getPrivate();
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);

            int j = 0;

            while(fileContents.get(j) != null) {

                String text = fileContents.get(j);

                try {                        
                    x = Hex.decodeHex(text.toCharArray());
                    y = cipher.doFinal(x);
                } catch (DecoderException ex) {
                    Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
                }

                try (PrintWriter file = new PrintWriter(
                        new BufferedWriter(
                        new FileWriter("DecryptedFile.txt", true)))) {
                    file.println(y);
                } catch (IOException e) {
                    System.err.println("IOERROR: " + e.getMessage() + "\n");
                }

                j++;
            }

        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) {
            Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
        }

    } catch (FileNotFoundException e) {
        System.err.println("IOERROR: File NOT Found: " + cryptoFile + "\n");
    } catch ( IOException e ) {
        System.err.println("IOERROR: " + e.getMessage() + "\n");
    } finally {
        messagePane.setText(messagePane.getText() + "\n\n"
                + cryptoFile + "is done being decrypted.");
        messagePane.setText(messagePane.getText() + "\n"
                + "Decrypted file saved to \'DecryptedFile.txt\'.");

        cryptoFile = "";
        pathTextField.setText(cryptoFile);
        encryptButton.setEnabled(false);
        decryptButton.setEnabled(false);

    }
4

1 回答 1

1

您在从 FileContents 派生的 String 派生的字符数组上使用密码 - 这可能会搞砸它的编码。相反,从文件中读取一个字节数组并将其用作密码的输入。

如有必要,填充输入是个好主意 - 使用Cipher.getInstance("RSA/ECB/PKCS1Padding")

将字符串转换为字节时始终指定字符编码(例如str.getBytes("UTF-8")),反之亦然 - 不同的 JVM 使用不同的默认字符编码。

于 2013-04-25T01:44:59.543 回答