title: Error in decryption of RSA data Java: javax.crypto.BadPaddingException: Decryption error
body: <p>I have problem with decryption (or maybe wrong encryption, too) of data with RSA in Java.
  I wanna encrypt public key with some more info in String and then decrypt this public key and encrypt with it something (I use 2048 RSA):</p>
  
  <p>Encryption:</p>
  
  <pre><code>public void saveExportToFile(String fileName, BigInteger mod, BigInteger exp, String info, PublicKey puk) throws IOException {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ObjectOutputStream oout = new ObjectOutputStream(new BufferedOutputStream(baos));
      try {
          oout.writeObject(mod);
          oout.writeObject(exp);
          oout.writeChars(info);
          oout.close();
          baos.close();
          Cipher cipher = Cipher.getInstance("RSA");
          cipher.init(Cipher.ENCRYPT_MODE, puk);
  
          FileOutputStream fos = new FileOutputStream(new File(fileName));
          BufferedOutputStream bos = new BufferedOutputStream(fos);
  
          byte[] data = baos.toByteArray();
  
          int i = 0;
          byte[] buffer = new byte[128];
          byte[] cipherData = null;
          while (i &lt; data.length) {
              if (i+128 &gt;= data.length) {
                  buffer = new byte[data.length - i];
                  System.arraycopy(data, i, buffer, 0, data.length - i);
                  cipherData = cipher.doFinal(buffer);
                  bos.write(cipherData);
              } else {
                  System.arraycopy(data, i, buffer, 0, 128);
                  cipherData = cipher.doFinal(buffer);
                  bos.write(cipherData);
              }
              i += 128;
          }
  
          bos.close();
      } catch (Exception e) {
          throw new IOException("Unexpected error", e);
      }
  }
  </code></pre>
  
  <p>Decryption:</p>
  
  <pre><code>public void getDataFromRSA(String sendname, PrivateKey privateKey) {
      try {
          BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(sendname)));
  
          Cipher cipher = Cipher.getInstance("RSA");
          cipher.init(Cipher.DECRYPT_MODE, privateKey);
  
          int length = 0;
          int allLength = 0;
          byte[] buffer = new byte[128];
          byte[] bufferAC = null;
          byte[] outData = null;
          byte[] allData = null;
          byte[] tmpData = null;
          while ( (length = bis.read(buffer)) != -1) {
              if (length &lt; 128) {
                  bufferAC = new byte[length];
                  System.arraycopy(buffer, 0, bufferAC, 0, length);
                  outData = cipher.doFinal(bufferAC);
              } else {
                  outData = cipher.doFinal(buffer); // HERE IS THE ERROR
              }
              allLength += outData.length;
              tmpData = allData;
              allData = new byte[allLength];
              System.arraycopy(tmpData, 0, allData, 0, tmpData.length);
              System.arraycopy(outData, 0, allData, tmpData.length, outData.length);
          }
      } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | ClassNotFoundException | InvalidKeySpecException e) {
          e.printStackTrace();
      }
  }
  </code></pre>
  
  <p><strong>EDIT</strong>
  OK, it seems I don't know about encryption as much as I thought. I'd like to use only RSA (if it's possible) since I don't need to transfer info more than once (size of info vary). I've edited encryption like this:</p>
  
  <pre><code>int i = 0;
  byte[] buffer = new byte[245];
  byte[] cipherData = null;
  while (i &lt; data.length) {
      if (i+245 &gt;= data.length) {
          buffer = new byte[data.length - i];
          System.arraycopy(data, i, buffer, 0, data.length - i);
      } else {
          System.arraycopy(data, i, buffer, 0, 245);
      }
      cipherData = cipher.update(buffer);
      bos.write(cipherData);
      i += 245;
  }
  bos.write(cipher.doFinal()); // HERE IS THE ERROR
  bos.close();
  </code></pre>
  
  <p>And now I get <code>javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes</code> (tried several lower values for buffer size). Is it because data length is not multiple of blocksize? Could this be fixed? Thanks for answers.</p>