Java RSA解密打印空

Java RSA解密打印空,java,cryptography,rsa,bufferedreader,printwriter,Java,Cryptography,Rsa,Bufferedreader,Printwriter,我相信我做得对。如何使用RSA解密文件: 以字符串形式读入文件的每一行 设置cipher.init(cipher.DECRYPT\u模式,私钥) 使用Hex.decodeChex(String.tocharray())将字符串转换为char[] 最后做cipher.doFinal(x) 这听起来对吗?我正在这样做,但它不起作用,DecryptedFile.txt只有两行“null” 我可以使用几乎相同的过程进行加密,但显然是使用cipher.init(cipher.encrypt\u MODE,

我相信我做得对。如何使用RSA解密文件:

  • 字符串形式读入文件的每一行
  • 设置
    cipher.init(cipher.DECRYPT\u模式,私钥)
  • 使用
    Hex.decodeChex(String.tocharray())将字符串转换为
    char[]
  • 最后做
    cipher.doFinal(x)
  • 这听起来对吗?我正在这样做,但它不起作用,
    DecryptedFile.txt
    只有两行“null”

    我可以使用几乎相同的过程进行加密,但显然是使用
    cipher.init(cipher.encrypt\u 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);
    
        }
    

    您正在对从FileContents派生的字符串派生的字符数组使用密码-这可能会破坏其编码。相反,从文件中读取一个字节数组,并将其用作密码的输入

    如果需要,最好填充输入-使用
    Cipher.getInstance(“RSA/ECB/PKCS1Padding”)


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

    RSA实际上是一种缓慢的算法-通常您不会使用它来加密文件,相反,你要用AES加密一个文件,然后用RSA加密AES密钥。@Zim-ZamO'Pootertoot我必须为我班的最后一个项目编写一个我选择的程序,我们被告知必须在其中使用RSA。明白了,在这种情况下,不用担心-只是不要在生产代码中这样做OK谢谢你的提醒如果我告诉你我逐行加密了文件然后保存了这个更改,这取决于你如何保存数据。如果您获取一个字符串,将其转换为字节[],对其进行加密,并将其保存到一个文件中,那么您需要读入与解密函数的输入完全相同的字节[]。我不知道最好的方法是什么;您可能需要更改输出函数,以便更容易地读回数据,例如,将字符串转换为字节[],对其进行加密,保存其长度,然后保存字节数组,这样您的文件将是例如120[120字节数组];现在您可以读取120个字节,然后读取接下来的120个字节,然后对它们进行解密。最好将长度字段设置为固定大小,可能需要两个字节,因此它将是[0][120][120字节的数据]。别忘了字节是用Java签名的,所以如果不小心的话,[0][128][128字节的数据]将作为-127字节的数据读入。我将每一行作为单独的字节数组保存到文本文件中,其中字节数组的长度在数组之前。例如,第一行是“128”[B@30479402第二个是“128”[B@2b462811“。在这种情况下,将数据读入字节数组应该没有问题。可能最简单的方法是通过ByteArrayInputStream(FileInputStream)将整个内容读入字节数组,然后将生成的字节数组解析为可以解密的子数组。