title: PBEWITHHMACSHA256ANDAES_256 encryption throws EncryptionOperationNotPossibleException
body: <p>I'd like to use the <code>PBEWITHHMACSHA256ANDAES_256</code> algorithm but it's not supported. I've added the <a href="https://www.bouncycastle.org/java.html" rel="nofollow noreferrer">bouncy castle</a> provider to my test in the hopes that it will work but to no avail. Can anyone please tell me how to fix the test below such that <code>PBEWITHHMACSHA256ANDAES</code> is added to the <code>Supported</code> list?</p>
  
  <pre><code>import java.security.Security;
  import java.util.Set;
  import java.util.TreeSet;
  
  import org.bouncycastle.jce.provider.BouncyCastleProvider;
  import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
  import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
  import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
  import org.jasypt.registry.AlgorithmRegistry;
  import org.junit.Assert;
  import org.junit.BeforeClass;
  import org.junit.Test;
  
  public class EncryptionTest {
      @BeforeClass
      public static void beforeClass() {
          Security.addProvider(new BouncyCastleProvider());
      }
  
      @Test
      public void test() {
          Set&lt;String&gt; supported = new TreeSet&lt;&gt;();
          Set&lt;String&gt; unsupported = new TreeSet&lt;&gt;();
          for (Object oAlgorithm : AlgorithmRegistry.getAllPBEAlgorithms()) {
              String algorithm = (String) oAlgorithm;
              try {
                  SimpleStringPBEConfig pbeConfig = new SimpleStringPBEConfig();
                  pbeConfig.setAlgorithm(algorithm);
                  pbeConfig.setPassword("changeme");
                  StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
                  encryptor.setConfig(pbeConfig);
  
                  String encrypted = encryptor.encrypt("foo");
                  String decrypted = encryptor.decrypt(encrypted);
                  Assert.assertEquals("foo", decrypted);
                  supported.add(algorithm);
              } catch (EncryptionOperationNotPossibleException e) {
                  unsupported.add(algorithm);
              }
          }
          System.out.println("Supported");
          supported.forEach((String alg) -&gt; System.out.println("   " + alg)); 
          System.out.println("Unsupported");
          unsupported.forEach((String alg) -&gt; System.out.println("   " + alg)); 
      }
  }            
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>Supported
     PBEWITHMD2ANDDES
     PBEWITHMD5AND128BITAES-CBC-OPENSSL
     PBEWITHMD5AND192BITAES-CBC-OPENSSL
     PBEWITHMD5AND256BITAES-CBC-OPENSSL
     PBEWITHMD5ANDDES
     PBEWITHMD5ANDRC2
     PBEWITHSHA1ANDDES
     PBEWITHSHA1ANDDESEDE
     PBEWITHSHA1ANDRC2
     PBEWITHSHA1ANDRC2_128
     PBEWITHSHA1ANDRC2_40
     PBEWITHSHA1ANDRC4_128
     PBEWITHSHA1ANDRC4_40
  Unsupported
     PBEWITHHMACSHA1ANDAES_128
     PBEWITHHMACSHA1ANDAES_256
     PBEWITHHMACSHA224ANDAES_128
     PBEWITHHMACSHA224ANDAES_256
     PBEWITHHMACSHA256ANDAES_128
     PBEWITHHMACSHA256ANDAES_256
     PBEWITHHMACSHA384ANDAES_128
     PBEWITHHMACSHA384ANDAES_256
     PBEWITHHMACSHA512ANDAES_128
     PBEWITHHMACSHA512ANDAES_256
     PBEWITHMD5ANDTRIPLEDES
     PBEWITHSHA256AND128BITAES-CBC-BC
     PBEWITHSHA256AND192BITAES-CBC-BC
     PBEWITHSHA256AND256BITAES-CBC-BC
     PBEWITHSHAAND128BITAES-CBC-BC
     PBEWITHSHAAND128BITRC2-CBC
     PBEWITHSHAAND128BITRC4
     PBEWITHSHAAND192BITAES-CBC-BC
     PBEWITHSHAAND2-KEYTRIPLEDES-CBC
     PBEWITHSHAAND256BITAES-CBC-BC
     PBEWITHSHAAND3-KEYTRIPLEDES-CBC
     PBEWITHSHAAND40BITRC2-CBC
     PBEWITHSHAAND40BITRC4
     PBEWITHSHAANDIDEA-CBC
     PBEWITHSHAANDTWOFISH-CBC
  </code></pre>
  
  <p><strong>* Edit *</strong></p>
  
  <p>@EbbeMPedersen suggested that this algorithm is provided by SunJCE but I can see that SunJCE provider is enabled using the following code</p>
  
  <pre><code>for (Provider provider : Security.getProviders()) {
      System.out.println(provider.getName() + " " + provider.getClass().getName());
  }
  </code></pre>
  
  <p>Output</p>
  
  <pre><code>SUN sun.security.provider.Sun
  SunRsaSign sun.security.rsa.SunRsaSign
  SunEC sun.security.ec.SunEC
  SunJSSE com.sun.net.ssl.internal.ssl.Provider
  SunJCE com.sun.crypto.provider.SunJCE
  SunJGSS sun.security.jgss.SunProvider
  SunSASL com.sun.security.sasl.Provider
  XMLDSig org.jcp.xml.dsig.internal.dom.XMLDSigRI
  SunPCSC sun.security.smartcardio.SunPCSC
  SunMSCAPI sun.security.mscapi.SunMSCAPI
  BC org.bouncycastle.jce.provider.BouncyCastleProvider
  </code></pre>