title: Padding error when using RSA Encryption in C# and Decryption in Java
body: <p>Currently I am receiving the following error when using Java to decrypt a Base64 encoded RSA encrypted string that was made in C#:</p>
  
  <blockquote>
    <p>javax.crypto.BadPaddingException: Not PKCS#1 block type 2 or Zero padding</p>
  </blockquote>
  
  <p>The setup process between the exchange from .NET and Java is done by creating a private key in the .NET key store then from the PEM file extracted, created use keytool to create a JKS version with the private key. Java loads the already created JKS and decodes the Base64 string into a byte array and then uses the private key to decrypt.</p>
  
  <p>Here is the code that I have in C# that creates the encrypted string:</p>
  
  <pre><code>public string Encrypt(string value) {
      byte[] baIn = null;
      byte[] baRet = null;
      string keyContainerName = "test";
  
      CspParameters cp = new CspParameters();
      cp.Flags = CspProviderFlags.UseMachineKeyStore;
      cp.KeyContainerName = keyContainerName;
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
  
      // Convert the input string to a byte array 
      baIn = UnicodeEncoding.Unicode.GetBytes(value);
  
      // Encrypt
      baRet = rsa.Encrypt(baIn, false);
  
      // Convert the encrypted byte array to a base64 string
      return Convert.ToBase64String(baRet);
  }
  </code></pre>
  
  <p>Here is the code that I have in Java that decrypts the inputted string:</p>
  
  <pre><code>public void decrypt(String base64String) {
      String keyStorePath = "C:\Key.keystore";
      String storepass = "1234";
      String keypass = "abcd";
      byte[] data = Base64.decode(base64String);
      byte[] cipherData = null;
  
      keystore = KeyStore.getInstance("JKS");
      keystore.load(new FileInputStream(keyStorePath), storepass.toCharArray());
  
      RSAPrivateKey privateRSAKey = (RSAPrivateKey) keystore.getKey(alias, keypass.toCharArray());
  
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
      cipher.init(Cipher.DECRYPT_MODE, privateRSAKey);
      cipherData = cipher.doFinal(data);
  
      System.out.println(new String(cipherData));
  }
  </code></pre>
  
  <p>Does anyone see a step missing or where the padding or item needs to be changed? I have done hours of reading on this site and others but haven't really found a concrete solution.</p>
  
  <p>You're help is vastly appreciated.</p>
  
  <p>Thanks.   -Matt</p>