title: What's wrong with IBM's JCE provider?
body: <p>I have a JCE test that works fine with all Sun JDKs I have tried, but fails with various IBM J9 JDKs (e.g. 1.6.0 build pwi3260sr8-20100409_01(SR8)). The exception below happens when the cipher is initialized in encrypt mode. Why can the IBM JCE not use its own private key? Am I missing something in my code?</p>
  
  <pre><code>  public void testBasicKeyGeneration() throws NoSuchAlgorithmException, 
        NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, 
        BadPaddingException, NoSuchProviderException, SignatureException {
        KeyPairGenerator generator = KeyPairGenerator.getInstance( "RSA" );
        generator.initialize( 2048 );
        KeyPair pair = generator.generateKeyPair();
  
        String data1 = "123456789012345678901234567890123456789012345678901234567890";
        Cipher cipher = Cipher.getInstance( "RSA" );
        cipher.init( Cipher.ENCRYPT_MODE, pair.getPrivate() );
        byte[] encrypted = cipher.doFinal( data1.getBytes() );
  
        cipher.init( Cipher.DECRYPT_MODE, pair.getPublic() );
        byte[] decrypted = cipher.doFinal( encrypted );
        String data2 = new String( decrypted );
        assertEquals( "en/decryption failed", data1, data2 );
    }
  </code></pre>
  
  <p>Here is the stack trace:</p>
  
  <pre><code>java.security.InvalidKeyException: Private key cannot be used to encrypt.
  at com.ibm.crypto.provider.RSA.engineInit(Unknown Source)
  at javax.crypto.Cipher.a(Unknown Source)
  at javax.crypto.Cipher.a(Unknown Source)
  at javax.crypto.Cipher.init(Unknown Source)
  at javax.crypto.Cipher.init(Unknown Source)
  at test.Test.testBasicKeyGeneration(LicenseHelperTest.java:56)
  </code></pre>