2012-11-28 36 views
1

我試圖用充氣城堡的lib要麼bcprov-jdk15-136.jarbcprov-jdk16-140.jar充氣城堡LIB產生「java.lang.IllegalArgumentException異常:不能編碼公鑰」

我有以下的RSA私鑰:

generateRSAKeyPair - RSA私鑰,iccKeypair下KEK B058474721CBD75820F5F56C1AC91B593FF8C28C866E7764BFC59C6070781524ACB91501FAB84250F04FAF9776712B82558C2B8985EA0CFD718577360A362BFBBC761DFC94EE8582250EB31A04B147DAC28FF425511923832199D2D4BE2E296EF1A1A249BCB68 cyphered 012508DBDE6CF0C7AB6313EFBBE2A0E527AD5C481A37E00473859C578269D972A243756991AD40E231C6051C50BBF71559D2FA77AC6A2D7CC2D101DEB5FBC0B4EAB1E16093A9AF181338F68E56611166725A8EFE2284EC0FB8F7919B8556B30E4BCEBE8150873DC5E0F9467686E38F4742746412EB4402FFC471AC0A55C9486ED2A613ADED759607675A548029C9C70875452A2724EC7D9E1D96D928BCE1FCF1681C39759CDE165CD9B484B222D2D33C3CA53BD461F11033F503F618FB4B9003C946D5B785594950E2C4A8D6EB299E19FF1147183A59A7FAFA2F3AD676917DAF0E14C735BB526266D8732F608B282891D0887C58C65857D52B00EE5E24B3C58426E9F6858DC7E6807F6B2CE4353A4088DBE8761F20AB0017541D0E0A58637342744870B18BB1D3606EAC351D049EE064E0C5CED63983B52E1D4D2A484CC82D962CD06FA611AD06075F04F642FFDB2FC0EFF89294313E519402DDF8B98DF821689A2E00CB5839DACE3D96D69E1FC3CF3D79FD84C72904D24D392

,並具有以下RSA公鑰:

generateRSAKeyPair - RSA公鑰,iccKeypair下KEK BDBC2FC40FBA580EFB9A9AC346C10FCE6F4C72BD6D79D2039807ABAB644D9F49F5EC06152B78A9C4D7468D6A82F3FEBFF0ABC7EE166C9FBC2A10DB1FE1AA4C66D6B94C871BEC97CE818EE03DDBFB55F5CC9E050E7BB7202EEBD6471172491F2EA22B83D62A747EE6677DBB7CFDA2ED6B0C3EE10D550760E20654A0421133778B cyphered

每當我試圖運行下面的代碼:

X500Principal subject = new X500Principal("CN=Test V3 Certificate"); 
PKCS10CertificationRequest kpGen = new PKCS10CertificationRequest("SHA1withRSA", subject, publicKey, null, privateKey); 

我不斷收到

java.lang.IllegalArgumentException: can't encode public key 
    at org.bouncycastle.jce.PKCS10CertificationRequest.<init>(Unknown Source) 
    at org.bouncycastle.jce.PKCS10CertificationRequest.<init>(Unknown Source) 
    at com.gemalto.nrs.test.KmsTest.generatePCK10(KmsTest.java:148) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) 
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518) 
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052) 
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:906) 

,當我嘗試調試代碼,有時我得到

java.lang.ClassCastException: org.bouncycastle.asn1.DERApplicationSpecific cannot be cast to org.bouncycastle.asn1.ASN1Sequence 
at org.bouncycastle.jce.PKCS10CertificationRequest.<init>(Unknown Source) 
at org.bouncycastle.jce.PKCS10CertificationRequest.<init>(Unknown Source) 
at com.gemalto.nrs.test.KmsTest.generatePCK10(KmsTest.java:148) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) 
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518) 
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052) 
+1

看起來你只是在調用隨機方法,並希望有好的事情發生。它不會,所以不要這樣做。 「KEK下的iccKeypair加密」是你的線索,你有一些特別的東西。也許這些來自一些硬件令牌? –

+0

KEK的意思是密鑰加密密鑰,所以你的信息是用(對稱)密鑰加密的。您需要解密密鑰才能使用它們。 –

+0

生成的公鑰和私鑰是絕對DER,它不是ASN1 –

回答

0

生成的公鑰和私鑰只是DER,它不ASN1

,所以我必須得到ASN1的他們每個人在使用它們之前都是這個問題的根源。

以下電話解決問題:

PublicKey publicKey = RSAtoX509Key.getPublicKey(PUBLIC_KEY.getBytes(), RSA_EXPONENT, "BC"); 
    PrivateKey privateKey = RSAtoX509Key.getPrivateKey(PRIVATE_KEY.getBytes(), RSA_EXPONENT, "BC"); 

    public static PublicKey getPublicKey(byte[] modulus, byte[] exponent, String provider) { 
     PublicKey publicKey = null; 
     try { 
      RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(1, modulus), new BigInteger(1, exponent)); 
      KeyFactory keyFactory = null; 
      if(provider != null && !provider.isEmpty()) { 
       keyFactory = KeyFactory.getInstance("RSA", provider); 
      } else { 
       keyFactory = KeyFactory.getInstance("RSA"); 
      } 

      publicKey = keyFactory.generatePublic(pubKeySpec); 
     } catch(Exception ex) { 
      logger.error(ex.getMessage()); 
      return null; 
     } 

     return publicKey; 
    } 

offcourse鑰匙在使用KEK密鑰加密的,但是,這是另一個問題,不涉及上述異常。