title: RSA BadPaddingException : data must start with zero
body: <p>I try to implement an RSA algorithm in a Java program. I am facing the "BadPaddingException : data must start with zero".
  Here are the methods used to encrypt and decrypt my data :</p>
  
  <pre><code>public byte[] encrypt(byte[] input)  throws Exception
  {
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//
      cipher.init(Cipher.ENCRYPT_MODE, this.publicKey);
      return cipher.doFinal(input);
  }
  
  public byte[] decrypt(byte[] input)  throws Exception
  {   
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");///
      cipher.init(Cipher.DECRYPT_MODE, this.privateKey);
      return cipher.doFinal(input);
  }
  </code></pre>
  
  <p>privateKey and publicKey attributes are read from files this way :</p>
  
  <pre><code>public PrivateKey readPrivKeyFromFile(String keyFileName) throws IOException {
      PrivateKey key = null;
      try {
          FileInputStream fin = new FileInputStream(keyFileName);
          ObjectInputStream ois = new ObjectInputStream(fin);
          BigInteger m = (BigInteger) ois.readObject();
          BigInteger e = (BigInteger) ois.readObject();
          RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
          KeyFactory fact = KeyFactory.getInstance("RSA");
          key = fact.generatePrivate(keySpec);
          ois.close();
      }
      catch (Exception e) {
         e.printStackTrace();
      }
      return key;
  }
  </code></pre>
  
  <p>Private key and Public key are created this way :</p>
  
  <pre><code>public void Initialize() throws Exception
  {
      KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
      keygen.initialize(2048);
      keyPair = keygen.generateKeyPair();
      KeyFactory fact = KeyFactory.getInstance("RSA");
      RSAPublicKeySpec pub = fact.getKeySpec(keyPair.getPublic(), RSAPublicKeySpec.class);
      RSAPrivateKeySpec priv = fact.getKeySpec(keyPair.getPrivate(), RSAPrivateKeySpec.class);
  
      saveToFile("public.key", pub.getModulus(), pub.getPublicExponent());
      saveToFile("private.key", priv.getModulus(), priv.getPrivateExponent());
  }
  </code></pre>
  
  <p>and then saved in files :</p>
  
  <pre><code>public void saveToFile(String fileName, BigInteger mod, BigInteger exp) throws IOException {
      FileOutputStream f = new FileOutputStream(fileName);
      ObjectOutputStream oos = new ObjectOutputStream(f);
      oos.writeObject(mod);
      oos.writeObject(exp);
      oos.close();
  }
  </code></pre>
  
  <p>I can't figured out how the problem come from. Any help would be appreciate !</p>
  
  <p>Thanks in advance.</p>