title: Java Encryption and C# Decryption Issue
body: <p>I have a DLL in C# that encrypts and decrypts string texts (something basic), but now I need to implement the same encryption method in Java, so that some applications can encrypt data and send it to the library.</p>
  
  <p>I can't modify the C# code, because it's already in production, but the Java don't, so please, any suggestion must be done at the Java side.</p>
  
  <p>Basically I'm trying to implement the same C# encryption method in Java. Here are my C# codes:</p>
  
  <p><strong>NOTE</strong>: the passphrase, salt, etc. values obviously are just referential.</p>
  
  <pre><code>    const string PassPhrase = "IhDyHz6bgQyS0Ff1/1s="; 
      const string SaltValue = "0A0Qvv09OXd3GsYHVrA=";   
      const string HashAlgorithm = "SHA1";                
      const int PasswordIterations = 3;                 
      const string InitVector = "GjrlRZ6INgNckBqv";      
      const int KeySize = 256;
  
  
  public static string Encrypt(string plainText)
      {
  
          byte[] initVectorBytes = Encoding.ASCII.GetBytes(InitVector);
          byte[] saltValueBytes = Encoding.ASCII.GetBytes(SaltValue);
  
  
          byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
  
  
          PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                          PassPhrase,
                                                          saltValueBytes,
                                                          HashAlgorithm,
                                                          PasswordIterations);
  
  
          byte[] keyBytes = password.GetBytes(KeySize / 8);
  
  
          RijndaelManaged symmetricKey = new RijndaelManaged();
  
  
          symmetricKey.Mode = CipherMode.CBC;
  
  
          ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
                                                           keyBytes,
                                                           initVectorBytes);
  
  
          MemoryStream memoryStream = new MemoryStream();
  
  
          CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                       encryptor,
                                                       CryptoStreamMode.Write);
  
          cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
  
  
          cryptoStream.FlushFinalBlock();
  
  
          byte[] cipherTextBytes = memoryStream.ToArray();
  
  
          memoryStream.Close();
          cryptoStream.Close();
  
  
          string cipherText = Convert.ToBase64String(cipherTextBytes);
  
  
          return cipherText;
      }
  
  
  public static string Decrypt(string cipherText)
      {
  
          byte[] initVectorBytes = Encoding.ASCII.GetBytes(InitVector);
          byte[] saltValueBytes = Encoding.ASCII.GetBytes(SaltValue);
  
  
          byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
  
          PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                          PassPhrase,
                                                          saltValueBytes,
                                                          HashAlgorithm,
                                                          PasswordIterations);
  
  
          byte[] keyBytes = password.GetBytes(KeySize / 8);
  
  
          RijndaelManaged symmetricKey = new RijndaelManaged();
  
  
          symmetricKey.Mode = CipherMode.CBC;
  
  
          ICryptoTransform decryptor = symmetricKey.CreateDecryptor(
                                                           keyBytes,
                                                           initVectorBytes);
  
  
          MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
  
  
          CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                        decryptor,
                                                        CryptoStreamMode.Read);
  
  
          byte[] plainTextBytes = new byte[cipherTextBytes.Length];
  
  
          int decryptedByteCount = cryptoStream.Read(plainTextBytes,
                                                     0,
                                                     plainTextBytes.Length);
  
  
          memoryStream.Close();
          cryptoStream.Close();
  
  
          string plainText = Encoding.UTF8.GetString(plainTextBytes,
                                                     0,
                                                     decryptedByteCount);
  
  
          return plainText;
      }
  </code></pre>
  
  <p>Here is my java code, it encrypts the data, but not at the same way as the C# encryption code, so when I try to decrypt it using the C# library it throws the exception: "Length of the data to decrypt is invalid"</p>
  
  <pre><code>    static final String PassPhrase = "IhDyHz6bgQyS0Ff1/1s=";   
      static final String SaltValue = "0A0Qvv09OXd3GsYHVrA=";    
      static final String HashAlgorithm = "SHA1";               
      static final int PasswordIterations = 3;                   
      static final String InitVector = "GjrlRZ6INgNckBqv";       
      static final int KeySize = 256;
  
  public static String encrypt(String plainText)
  {
      char[] password = PassPhrase.toCharArray();
      byte[] salt = SaltValue.getBytes();
      byte[] iv = InitVector.getBytes();
      byte[] ciphertext = new byte[0];
  
      SecretKeyFactory factory;
      try {
          factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
  
          KeySpec spec = new PBEKeySpec(password, salt, PasswordIterations, 256);
          SecretKey tmp;
  
          tmp = factory.generateSecret(spec);
  
          SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
  
          Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
          cipher.init(Cipher.ENCRYPT_MODE, secret);
          AlgorithmParameters params = cipher.getParameters();
          //iv = params.getParameterSpec(IvParameterSpec.class).getIV();
          ciphertext = cipher.doFinal(plainText.getBytes("UTF-8"));
  
      } catch (NoSuchAlgorithmException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (InvalidKeySpecException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (NoSuchPaddingException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (InvalidKeyException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } 
      //catch (InvalidParameterSpecException e) {
      //  // TODO Auto-generated catch block
      //  e.printStackTrace();
      //} 
      catch (IllegalBlockSizeException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (BadPaddingException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (UnsupportedEncodingException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  
      return Base64.encode(new String(ciphertext));
  }
  </code></pre>
  
  <p><strong>EDIT 1</strong>: I fixed the final byte array conversion to String in the Java code, as Jon Skeet suggested.</p>