RSA解密打印NULL

时间:2013-04-25 01:22:35

标签: java cryptography rsa bufferedreader printwriter

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

  1. String
  2. 的形式读取文件的每一行
  3. 设置cipher.init(Cipher.DECRYPT_MODE, privateKey)
  4. 使用char[]
  5. 将字符串转换为Hex.decodeHex(String.toCharArray())
  6. 最后做cipher.doFinal(x)
  7. 这听起来不错吗?我这样做但它不起作用,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);
    
        }
    

1 个答案:

答案 0 :(得分:1)

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

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

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