Java 使用密码RSA编写加密的PDF文件

Java 使用密码RSA编写加密的PDF文件,java,pdf,encryption,Java,Pdf,Encryption,在下面的代码中,我获取一个现有的pdf文件,对其进行加密,然后输出加密文件。我的问题是输出的文件不能正常工作。它创建一个零字节的文件。我用一个简单的文本文件“sample.txt”尝试了相同的代码,效果很好。输出的文件是通过加密创建的 谁能告诉我我可能做错了什么?它与PDF文件的工作方式不同吗 public void encryptFile() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException

在下面的代码中,我获取一个现有的pdf文件,对其进行加密,然后输出加密文件。我的问题是输出的文件不能正常工作。它创建一个零字节的文件。我用一个简单的文本文件“sample.txt”尝试了相同的代码,效果很好。输出的文件是通过加密创建的

谁能告诉我我可能做错了什么?它与PDF文件的工作方式不同吗

public void encryptFile() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, CertificateException, KeyStoreException, IOException {

    FileInputStream fis = new FileInputStream("c:\\sample.pdf");
    FileOutputStream fos = new FileOutputStream("c:\\sample_encrypted");

    Cipher c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
    c.init(Cipher.ENCRYPT_MODE, getSapPublicCertificate().getPublicKey());
    CipherOutputStream cos = new CipherOutputStream(fos, c);

    byte[] buf = new byte[2048];
    int read;
    while ((read = fis.read(buf)) != -1) {
        cos.write(buf, 0, read);
    }

    fis.close();
    cos.flush();
    cos.close();
}
编辑 我应该提到的是,我尝试了上面相同的事情,但没有任何cipher/cipherOutPutStream,新的克隆文件正确生成。代码如下。所以我倾向于相信这是密码或CipherOutputStream的问题。但是,正如前面提到的,它在一个简单的文本文件中运行良好

    byte[] buffer = new byte[2048];
    int read;
    while ((read = fis.read(buffer)) != -1) {
        fos.write(buffer, 0, read);
    }
EDIT2方法GetCertificate()的内容

你需要使用。不能使用RSA加密大文件。我确实想知道你是如何处理你的错误的,或者当你的程序没有完成时你会做什么;Java运行时系统应该能够捕捉到这些问题

文本文件和PDF文件之间的文件处理没有区别,只是大小不同


混合加密归结为:

  • 生成完全随机对称密钥(例如AES-128)
  • 加密文件,例如使用AES-CBC和零IV
  • 使用RSA-OAEP或RSA-PKCS#1加密对称密钥
  • 发送或存储密文和加密的对称密钥 解密过程如下:

  • 检索密文和RSA加密的对称密钥
  • 使用私钥解密对称密钥
  • 解密密文

  • 你知道getSAPublicCertificate().getPublicKey()返回什么值吗?嗨,Jay,我在上面添加了方法定义。我的配对钥匙是用这个Hi的信息生成的,让我看看我是否了解这个混合动力系统,如果我不了解,请纠正我。我需要使用对称算法加密文件。然后使用公钥将对称密钥和对称加密的文件一起加密。然后,我使用非对称私钥对其进行解密。这将为我提供对称密钥和加密文件。然后我使用对称密钥解密对称加密的文件。我接近了吗?确实接近了,我会把它写在答案里。
    public Certificate getSapPublicCertificate() throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {
        char[] password = "mypass".toCharArray();
        String alias = "myalias";
    
        FileInputStream fIn = new FileInputStream(keystoreSapCertificate);
        KeyStore keystore = KeyStore.getInstance("JKS");
    
        keystore.load(fIn, password);
        Certificate cert = keystore.getCertificate(alias);
    
        return cert;
    }