title: C# Encrypt/Decrypt from Java AES/CBC/PKCS5Padding
body: <p>I'm facing an issue trying to Decrypt a string which has been encrypted in Java with the following properties (Java code)</p>
  
  <pre><code>public static Builder getDefaultBuilder(String key, String salt, byte[] iv) {
          return new Builder()
                  .setIv(iv)
                  .setKey(key)
                  .setSalt(salt)
                  .setKeyLength(128)
                  .setKeyAlgorithm("AES")
                  .setCharsetName("UTF8")
                  .setIterationCount(1)
                  .setDigestAlgorithm("SHA1")
                  .setBase64Mode(Base64.DEFAULT)
                  .setAlgorithm("AES/CBC/PKCS5Padding")
                  .setSecureRandomAlgorithm("SHA1PRNG")
                  .setSecretKeyType("PBKDF2WithHmacSHA1");
      }
  </code></pre>
  
  <p>This is my code so far (C#)</p>
  
  <pre><code>public string DecryptText(string encryptedString)
      {
          using (myRijndael = new RijndaelManaged())
          {
              myRijndael.Key = Convert.FromBase64String(encryptionKey);
              myRijndael.IV = new byte[16];
              myRijndael.Mode = CipherMode.CBC;
              myRijndael.Padding = PaddingMode.PKCS7;
  
              Byte[] ourEnc = Convert.FromBase64String(encryptedString);
              string ourDec = DecryptStringFromBytes(ourEnc, myRijndael.Key, myRijndael.IV);
  
              return ourDec;
          }
      }
  
  protected string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
      {
          // Check arguments. 
          if (cipherText == null || cipherText.Length &lt;= 0)
              throw new ArgumentNullException("cipherText");
          if (Key == null || Key.Length &lt;= 0)
              throw new ArgumentNullException("Key");
          if (IV == null || IV.Length &lt;= 0)
              throw new ArgumentNullException("Key");
  
          // Declare the string used to hold 
          // the decrypted text. 
          string plaintext = null;
  
          // Create an RijndaelManaged object 
          // with the specified key and IV. 
          using (RijndaelManaged rijAlg = new RijndaelManaged())
          {
              rijAlg.Key = Key;
              rijAlg.IV = IV;
  
              // Create a decrytor to perform the stream transform.
              ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
  
              // Create the streams used for decryption. 
              using (MemoryStream msDecrypt = new MemoryStream(cipherText))
              {
                  using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                  {
                      using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                      {
  
                          // Read the decrypted bytes from the decrypting stream 
                          // and place them in a string.
                          plaintext = srDecrypt.ReadToEnd();
                      }
                  }
              }
  
          }
  
          return plaintext;
  
      }
  </code></pre>
  
  <p>But when I try to decrypt I get the following  exception "System.Security.Cryptography.CryptographicException: 'Specified key is not a valid size for this algorithm.'
  ".</p>
  
  <p>The origin of the Java code resides here
  <a href="https://github.com/simbiose/Encryption/blob/master/Encryption/main/se/simbio/encryption/Encryption.java" rel="nofollow noreferrer">https://github.com/simbiose/Encryption/blob/master/Encryption/main/se/simbio/encryption/Encryption.java</a></p>
  
  <p>This is the Java code when encrypting</p>
  
  <pre><code>public String encrypt(String data) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, InvalidKeyException, InvalidKeySpecException, BadPaddingException, IllegalBlockSizeException {
      if (data == null) return null;
      SecretKey secretKey = getSecretKey(hashTheKey(mBuilder.getKey()));
      byte[] dataBytes = data.getBytes(mBuilder.getCharsetName());
      Cipher cipher = Cipher.getInstance(mBuilder.getAlgorithm());
      cipher.init(Cipher.ENCRYPT_MODE, secretKey, mBuilder.getIvParameterSpec(), mBuilder.getSecureRandom());
      return Base64.encodeToString(cipher.doFinal(dataBytes), mBuilder.getBase64Mode());
  }
  
  private SecretKey getSecretKey(char[] key) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeySpecException {
      SecretKeyFactory factory = SecretKeyFactory.getInstance(mBuilder.getSecretKeyType());
      KeySpec spec = new PBEKeySpec(key, mBuilder.getSalt().getBytes(mBuilder.getCharsetName()), mBuilder.getIterationCount(), mBuilder.getKeyLength());
      SecretKey tmp = factory.generateSecret(spec);
      return new SecretKeySpec(tmp.getEncoded(), mBuilder.getKeyAlgorithm());
  }
  
  
  private char[] hashTheKey(String key) throws UnsupportedEncodingException, NoSuchAlgorithmException {
      MessageDigest messageDigest = MessageDigest.getInstance(mBuilder.getDigestAlgorithm());
      messageDigest.update(key.getBytes(mBuilder.getCharsetName()));
      return Base64.encodeToString(messageDigest.digest(), Base64.NO_PADDING).toCharArray();
  }
  </code></pre>
  
  <p>I've been struggling with this for two day since I haven't really worked a lot with encryption, so any help would be greatly appreciated.</p>
  
  <p>Thanks!</p>
  
  <p>Update:
  Whole class</p>
  
  <pre><code>public sealed class MyCryptoClass
  {
      protected RijndaelManaged myRijndael;
  
      private static string encryptionKey = "random";
  
      // Singleton pattern used here with ensured thread safety
      protected static readonly MyCryptoClass _instance = new MyCryptoClass();
      public static MyCryptoClass Instance
      {
          get { return _instance; }
      }
  
      public MyCryptoClass()
      {
  
      }
  
      public string DecryptText(string encryptedString)
      {
          using (myRijndael = new RijndaelManaged())
          {
              myRijndael.Key = Convert.FromBase64String(encryptionKey);
              myRijndael.IV = new byte[16];
              myRijndael.Mode = CipherMode.CBC;
              myRijndael.Padding = PaddingMode.PKCS7;
  
              Byte[] ourEnc = Convert.FromBase64String(encryptedString);
              string ourDec = DecryptStringFromBytes(ourEnc, myRijndael.Key, myRijndael.IV);
  
              return ourDec;
          }
      }
  
  
      public string EncryptText(string plainText)
      {
          using (myRijndael = new RijndaelManaged())
          {
  
              myRijndael.Key = HexStringToByte(encryptionKey);
              myRijndael.IV = HexStringToByte(initialisationVector);
              myRijndael.Mode = CipherMode.CBC;
              myRijndael.Padding = PaddingMode.PKCS7;
  
              byte[] encrypted = EncryptStringToBytes(plainText, myRijndael.Key, myRijndael.IV);
              string encString = Convert.ToBase64String(encrypted);
  
              return encString;
          }
      }
  
  
      protected byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
      {
          // Check arguments. 
          if (plainText == null || plainText.Length &lt;= 0)
              throw new ArgumentNullException("plainText");
          if (Key == null || Key.Length &lt;= 0)
              throw new ArgumentNullException("Key");
          if (IV == null || IV.Length &lt;= 0)
              throw new ArgumentNullException("Key");
          byte[] encrypted;
          // Create an RijndaelManaged object 
          // with the specified key and IV. 
          using (RijndaelManaged rijAlg = new RijndaelManaged())
          {
              rijAlg.Key = Key;
              rijAlg.IV = IV;
  
              // Create a decrytor to perform the stream transform.
              ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
  
              // Create the streams used for encryption. 
              using (MemoryStream msEncrypt = new MemoryStream())
              {
                  using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                  {
                      using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                      {
  
                          //Write all data to the stream.
                          swEncrypt.Write(plainText);
                      }
                      encrypted = msEncrypt.ToArray();
                  }
              }
          }
  
  
          // Return the encrypted bytes from the memory stream. 
          return encrypted;
  
      }
  
      protected string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
      {
          // Check arguments. 
          if (cipherText == null || cipherText.Length &lt;= 0)
              throw new ArgumentNullException("cipherText");
          if (Key == null || Key.Length &lt;= 0)
              throw new ArgumentNullException("Key");
          if (IV == null || IV.Length &lt;= 0)
              throw new ArgumentNullException("Key");
  
          // Declare the string used to hold 
          // the decrypted text. 
          string plaintext = null;
  
          // Create an RijndaelManaged object 
          // with the specified key and IV. 
          using (RijndaelManaged rijAlg = new RijndaelManaged())
          {
              rijAlg.Key = Key;
              rijAlg.IV = IV;
  
              // Create a decrytor to perform the stream transform.
              ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
  
              // Create the streams used for decryption. 
              using (MemoryStream msDecrypt = new MemoryStream(cipherText))
              {
                  using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                  {
                      using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                      {
  
                          // Read the decrypted bytes from the decrypting stream 
                          // and place them in a string.
                          plaintext = srDecrypt.ReadToEnd();
                      }
                  }
              }
  
          }
  
          return plaintext;
  
      }
  
      public static void GenerateKeyAndIV()
      {
          // This code is only here for an example
          RijndaelManaged myRijndaelManaged = new RijndaelManaged();
          myRijndaelManaged.Mode = CipherMode.CBC;
          myRijndaelManaged.Padding = PaddingMode.PKCS7;
  
          myRijndaelManaged.GenerateIV();
          myRijndaelManaged.GenerateKey();
          string newKey = ByteArrayToHexString(myRijndaelManaged.Key);
          string newinitVector = ByteArrayToHexString(myRijndaelManaged.IV);
      }
  
      protected static byte[] HexStringToByte(string hexString)
      {
          try
          {
              int bytesCount = (hexString.Length) / 2;
              byte[] bytes = new byte[bytesCount];
              for (int x = 0; x &lt; bytesCount; ++x)
              {
                  bytes[x] = Convert.ToByte(hexString.Substring(x * 2, 2), 16);
              }
              return bytes;
          }
          catch
          {
              throw;
          }
      }
  
      public static string ByteArrayToHexString(byte[] ba)
      {
          StringBuilder hex = new StringBuilder(ba.Length * 2);
          foreach (byte b in ba)
              hex.AppendFormat("{0:x2}", b);
          return hex.ToString();
      }
  }
  </code></pre>