【问题标题】:Android: Cipher with public key from php serverAndroid:使用来自 php 服务器的公钥的密码
【发布时间】:2017-02-19 06:45:44
【问题描述】:

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

php服务器代码:

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

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

echo $pubKey;

服务器正确创建密钥。在我的应用程序中,我将公钥存储在“响应”变量中。这个变量就像: response = "-----BEGIN PUBLIC KEY-----MIIB... etc ...wIDAQAB-----END PUBLIC KEY-----"

安卓代码:

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: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag

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

【问题讨论】:

标签: java php android public-key-encryption


【解决方案1】:

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

response = response.replaceAll("(-+BEGIN PUBLIC KEY-+\\r?\\n|-+END PUBLIC KEY-+\\r?\\n?)", "");
response = response.replace("\n", "").replace("\r", "");
// Use Base64.NO_WRAP because: https://stackoverflow.com/questions/32935783/java-different-results-when-decoding-base64-string-with-java-util-base64-vs-and/32935972
byte[] responseBytes = Base64.decode(response, Base64.NO_WRAP);
KeySpec keySpec = new X509EncodedKeySpec(responseBytes);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2014-09-15
    相关资源
    最近更新 更多