Android:具有来自php服务器的公共密钥的密码

问题描述 投票:0回答:1

我正在尝试使用从我的php服务器获得的公共密钥在Android应用程序中编写一个字符串。

php服务器代码:

$res = openssl_pkey_new();
openssl_pkey_export($res, $privKey);

$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

echo $pubKey;

服务器正确创建密钥。在我的应用程序中,我将公钥存储在“响应”变量中。这个变量就像:响应=“ -----开始公钥----- MIIB ...等... wIDAQAB -----结束公钥-----”

Android代码:

String pass = "password";
String strEncryInfoData="";
try {
     KeyFactory keyFac = KeyFactory.getInstance("RSA");
     KeySpec keySpec = new X509EncodedKeySpec(Base64.decode(response.trim().getBytes(), Base64.DEFAULT));
     Key publicKey = keyFac.generatePublic(keySpec);

     cipher = Cipher.getInstance("RSA");
     cipher.init(Cipher.ENCRYPT_MODE, publicKey);
     byte[] cipherText = cipher.doFinal(pass.getBytes());
     strEncryInfoData = new String(Base64.encode(cipherText,Base64.DEFAULT));
} catch (Exception e){

}

当我运行应用程序时,出现此错误:java.security.spec.InvalidKeySpecException:java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误标记

我不知道为什么代码没有写密码。任何的想法?关于编码类型?谢谢。

java php android public-key-encryption
1个回答
0
投票

尝试删除BEGIN标头和END页脚以及所有换行符,然后您将获得Base64编码的DER,您需要对其进行解码并传递给X509EncodedKeySpec构造函数。这是一些代码:

response = response.replaceAll("(-+BEGIN PUBLIC KEY-+\\r?\\n|-+END PUBLIC KEY-+\\r?\\n?)", "");
response = response.replace("\n", "").replace("\r", "");
byte[] responseBytes = Base64.decode(response, Base64.DEFAULT);
KeySpec keySpec = new X509EncodedKeySpec(responseBytes);
© www.soinside.com 2019 - 2024. All rights reserved.