我见过很多类似的问题,但没有什么对我有用。我只是尝试将我从服务器检索到的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=
是否有一些我缺少的格式或文件类型?
答案 0 :(得分:4)
回答我自己的问题......第一个输出是十六进制,第二个输出是基数64.只需将return语句更改为return new String(Base64.encode(encryptedBytes));
你会好的!
答案 1 :(得分:0)
这不能回答问题,但是我发现相关的内容。发布为答案,因为它不适合作为评论。
-----BEGIN <something>-----
和-----END <something>-----
分隔结果。主要从ASN.1(wiki)来解释。
以下是如何使用密钥工厂以进行以下操作的示例 从其编码实例化DSA公钥。假设爱丽丝有 收到了Bob的数字签名。鲍勃还向她发送了公开信 密钥(以编码格式)以验证其签名。爱丽丝然后表演 以下操作:
X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey); KeyFactory keyFactory = KeyFactory.getInstance("DSA"); PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
...
请注意,此示例中bobEncodedPubKey
是DER编码的。
https://developer.android.com/reference/java/security/KeyFactory
类似于对DER所做的操作,但是请事先执行以下操作:
BEGIN
/ END
的定界,然后(问题已经显示了如何执行此操作的代码。)