JAVA RSA解密无法正常工作,抛出InvalidKeySpecException

我使用phpseclib生成RSA公钥和私钥。

$rsa = new Crypt_RSA(); $rsa->setHash('sha1'); $rsa->setMGFHash('sha1'); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); extract($rsa->createKey(2048)); 

然后我在我的Android应用程序中使用这两个键来加密/解密数据。

 public static final String publicKey = "MIIBIjANBgk......DAQAB"; public static final String privateKey = "MIIEpAI......Zh+0bQ=="; 

我可以使用公钥加密JAVA中的数据,并使用私钥在PHP中解密该数据。
这工作正常,

 public static String encryptData(String data) { String ret = null; try { PublicKey key = KeyFactory.getInstance("RSA").generatePublic( new X509EncodedKeySpec(Base64.decode(publicKey, Base64.DEFAULT))); Cipher cph = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cph.init(Cipher.ENCRYPT_MODE, key); ret = Base64.encodeToString(cph.doFinal(data.getBytes()), Base64.DEFAULT); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return ret; } 

PHP部分

 $rsa = new Crypt_RSA(); $rsa->loadKey($privatekey); echo $rsa->decrypt($encrypted); 

但是,当我尝试通过此函数解密java中的相同加密消息时,

 public static String decryptData(String data) { String ret = null; try { PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate( new PKCS8EncodedKeySpec(Base64.decode(privateKey, Base64.DEFAULT))); Cipher cph = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cph.init(Cipher.DECRYPT_MODE, key); ret = Base64.encodeToString(cph.doFinal(data.getBytes()), Base64.DEFAULT); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return ret; } 

我收到这个错误,

 06-05 11:48:26.854: W/System.err(1311): java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 06-05 11:48:26.862: W/System.err(1311): at com.android.org.conscrypt.OpenSSLKey.getPrivateKey(OpenSSLKey.java:136) 06-05 11:48:26.862: W/System.err(1311): at com.android.org.conscrypt.OpenSSLRSAKeyFactory.engineGeneratePrivate(OpenSSLRSAKeyFactory.java:64) 06-05 11:48:26.866: W/System.err(1311): at java.security.KeyFactory.generatePrivate(KeyFactory.java:186) 

请帮忙。 抱歉这个冗长的问题。

试试这个phpseclib的分支:

https://github.com/terrafrost/phpseclib/tree/pkcs8/phpseclib

而不是$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); do $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8);

问题是…… Java期待PKCS8密钥。 PKCS8密钥以-----BEGIN PRIVATE KEY-----而不是-----BEGIN RSA PRIVATE KEY-----开头。