JAVA RSA解密无法正常工作,抛出InvalidKeySpecException [英] JAVA RSA Decryption not working, throws InvalidKeySpecException
问题描述
我使用phpseclib生成RSA公钥和私钥。
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));
然后我在我的Android应用程序中使用这两个键来加密/解密数据。
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==";
我可以使用公钥加密JAVA中的数据,并使用私钥在PHP中解密该数据。 >
这很好用,
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部分
$rsa = new Crypt_RSA();
$rsa->loadKey($privatekey);
echo $rsa->decrypt($encrypted);
但是当我尝试通过此函数解密java中相同的加密消息时,
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;
}
我收到此错误,
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.
推荐答案
试试这个phpseclib的分支:
Try this branch of 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-- ---
。
The thing is... Java is expecting a PKCS8 key. A PKCS8 key starts with -----BEGIN PRIVATE KEY-----
instead of -----BEGIN RSA PRIVATE KEY-----
.
这篇关于JAVA RSA解密无法正常工作,抛出InvalidKeySpecException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!