JAVA RSA解密不工作,引发InvalidKeySpecException异常

JAVA RSA解密不工作,引发InvalidKeySpecException异常,java,android,rsa,phpseclib,Java,Android,Rsa,Phpseclib,我使用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(CRY

我使用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的这个分支:

而不是
$rsa->setPrivateKeyFormat(CRYPT\u rsa\u PRIVATE\u FORMAT\u PKCS1)
do
$rsa->setPrivateKeyFormat(CRYPT\u rsa\u PRIVATE\u FORMAT\u PKCS8)


问题是。。。Java需要PKCS8密钥。PKCS8密钥以
----BEGIN PRIVATE key----
开始,而不是
----BEGIN RSA PRIVATE key----

我使用了上面的库,也使用了PKCS8,但我的PHP脚本仍然在开始时使用“----BEGIN RSA PRIVATE key----”生成私钥:(尝试执行
echo$RSA->getprivate key(CRYPT\u RSA\u PRIVATE\u FORMAT\u PKCS8)
echo$rsa->getPrivateKey(CRYPT\u rsa\u PRIVATE\u格式\u PKCS8);不输出任何内容,只输出echo$publickey。“

”$privatekey。“

”;像以前一样输出密钥。哦,对了-这只是用于转换密钥,您正在尝试从头开始创建一个密钥。无论如何,我在我的原始帖子中建议的替换方法对我来说适用于该分支的代码。也许您不在该分支上。如果是这样,请尝试用以下内容替换您的Crypt/RSA.php:这是我的代码:谢谢,最后一个thing成功了。但是现在我需要你的另一个帮助。我通过一个脚本生成了公钥/私钥,然后通过另一个脚本使用它们来解密数据。但是解密不起作用$rsa->decrypt()返回false。我的代码: