【发布时间】:2015-01-08 12:41:30
【问题描述】:
我见过很多类似的问题,但没有一个对我很有效。我只是想将我从服务器检索到的 PEM 格式的 RSA 公钥转换为 Android 中的PublicKey。谁能指出我正确的方向?
编辑: 我已成功使用以下代码将 PEM 转换为 PublicKey,但是在对消息进行编码时,我得到了意外的输出...
public PublicKey getFromString(String keystr) throws Exception
{
// Remove the first and last lines
String pubKeyPEM = keystr.replace("-----BEGIN PUBLIC KEY-----\n", "");
pubKeyPEM = pubKeyPEM.replace("-----END PUBLIC KEY-----", "");
// Base64 decode the data
byte [] encoded = Base64.decode(pubKeyPEM);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pubkey = kf.generatePublic(keySpec);
return pubkey;
}
public String RSAEncrypt(final String plain) throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException {
if (pubKey!=null) {
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
encryptedBytes = cipher.doFinal(plain.getBytes());
Log.d("BYTES", new String(encryptedBytes));
return Hex.encodeHexString(encryptedBytes);
}
else
return null;
}
输出如下所示:
b6813f8791d67c0fa82890d005c8ff554b57143b752b34784ad271ec01bfaa9a6a31e7ae08444baef1585a6f78f3f848eecb1706bf7b2868fccefc9d728c30480f3aabc9ac5c3a9b4b3c74c2f7d6f0da235234953ea24b644112e04a2ec619f6bf95306ef30563c4608ec4b53ed7c15736d5f79c7fa1e35f2444beb366ae4c71
当我期待更接近:
JfoSJGo1qELUbpzH8d4QXtafup+J2F9wLxHCop00BQ4YS0cRdRCKDfHpFPZQYjNeyQj00HwHbz+vj8haTPbpdqT94AHAl+VZ+TPAiUw1U5EXLLyy4tzbmfVI7CwvMm26lwB4REzYUZdedha1caxMEfxQ5duB+x4ol9eRZM/savg=
是否缺少某些格式或文件类型?
【问题讨论】:
-
你试过stackoverflow.com/q/3243018的方法了吗?
-
我需要能够在应用程序中执行所有操作...不使用命令行
-
如果您需要 base64 输出,为什么要将您的密钥解码为二进制代码
byte [] encoded = Base64.decode(pubKeyPEM);? -
这是
X509EncodedKeySpec的预期输入 -
@cph2117 我正在尝试将您的代码与我的
.pem文件一起使用,但是,我的包含公钥的.pem文件不包含字符串"-----BEGIN PUBLIC KEY-----\n"我应该如何继续?