IBM的JCE提供商有什么问题?

Fel*_*ixM 5 java jce

我有一个JCE测试适用于我尝试过的所有Sun JDK,但是使用各种IBM J9 JDK(例如1.6.0 build pwi3260sr8-20100409_01(SR8))失败了.密码在加密模式下初始化时会发生以下异常.为什么IBM JCE不能使用自己的私钥?我在代码中遗漏了什么吗?

  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 );
  }
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

小智 7

有一个解决方案,请参阅http://www-01.ibm.com/support/docview.wss?uid=swg1IV18625

与财产

-Dcom.ibm.crypto.provider.DoRSATypeChecking=false
Run Code Online (Sandbox Code Playgroud)

您可以使用私钥来加密数据.


T.R*_*Rob 5

我不确定这一点,但我相信JCE有一个嵌入式策略,限制加密到公钥和解密到私钥.

在示例代码中,加密是使用私钥完成的.这将需要公钥解密,这意味着具有公钥的任何人都可以访问编码数据.虽然这有它的用途但它不是公认的模式,IBM实现可能会"保护"您不会意外地创建公开可读的加密数据.

当它们被逆转时它正确测试的事实往往证实了我的怀疑,但我还没有找到一份说明同样多的官方文件.