使用Cipher RSA编写加密的PDF文件

时间:2014-04-25 13:20:50

标签: java pdf encryption

在下面的代码中,我获取一个现有的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();
}

EDIT 我应该提一下,我尝试了同样的事情,但没有任何密码/ cipherOutPutStream,并且正确生成了新的克隆文件。代码如下。所以我倾向于认为它是Cipher或CipherOutputStream的问题。但话说回来,正如前面提到的,一切都与一个简单的文本文件一起工作。

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

EDIT2方法的内容getCertficate()

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;
}

1 个答案:

答案 0 :(得分:2)

您需要使用hybrid encryption。您无法使用RSA加密大型文件。我不知道你如何处理你的错误或你的程序没有完成时你做了什么;这些问题应该由Java运行时系统捕获。

文件处理在文本文件和PDF文件之间没有区别,只是尺寸不同。


混合加密归结为:

  1. 生成完全随机的对称密钥(例如AES-128);
  2. 加密文件,例如使用AES-CBC,零IV;
  3. 使用RSA-OAEP或RSA-PKCS#1加密对称密钥;
  4. 发送或存储密文和加密的对称密钥;
  5. 解密就像这样:

    1. 检索密文和RSA加密对称密钥;
    2. 使用私钥解密对称密钥;
    3. 解密密文。