title: Writing an encrypted PDF file using Cipher RSA
body: <p>In the code below, I grab an existing pdf file, encrypt it and then output the encrypted file. My problem is that the outputted file does not work properly. It creates a file of zero bytes. I tried the same code with a simple text file "sample.txt" and it worked fine. The outputted file was created with encryption.</p>
  
  <p>Can anyone tell me what I may be doing wrong? Does it work differently with PDF files? </p>
  
  <pre><code>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();
  }
  </code></pre>
  
  <p>EDIT
  I should mention that I tried the same thing above but without any cipher/cipherOutPutStream and the new cloned file was generated properly. The code is below. So I would tend to believe its an issue with Cipher or CipherOutputStream. But then again, as mentioned before, it all worked fine with a simple text file.</p>
  
  <pre><code>    byte[] buffer = new byte[2048];
      int read;
      while ((read = fis.read(buffer)) != -1) {
          fos.write(buffer, 0, read);
      }
  </code></pre>
  
  <p>EDIT2 Content of method getCertficate()</p>
  
  <pre><code>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;
  }
  </code></pre>