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

I used phpseclib to generate RSA public and private key.

$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));

Then i used these two keys in my android app to encrypt/decrypt data.

public static final String publicKey = "MIIBIjANBgk......DAQAB";

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

I can encrypt data in JAVA with public key and decrypt that data in PHP with private key.

This works fine,

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 Part

$rsa = new Crypt_RSA();

$rsa->loadKey($privatekey);

echo $rsa->decrypt($encrypted);

But when i try to decrypt the same encrypted message in java by this function,

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;

}

I get this error,

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)

Please help. And sorry for the lengthy question.

解决方案

Try this branch of phpseclib:

And instead of $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); do $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8);

The thing is... Java is expecting a PKCS8 key. A PKCS8 key starts with -----BEGIN PRIVATE KEY----- instead of -----BEGIN RSA PRIVATE KEY-----.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值