java - PEM 到 Android 中的 PublicKey

标签 java android rsa pem

我见过很多类似的问题,但没有一个对我有用。我只是想将从服务器检索到的 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=

是否缺少某些格式或文件类型?

最佳答案

回答我自己的问题...第一个输出是十六进制,第二个输出是 base 64。只需将 return 语句更改为 return new String(Base64.encode(encryptedBytes)); 你会好起来的!

关于java - PEM 到 Android 中的 PublicKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26873820/

相关文章:

java - Java建议(跳线)

java - 如何使用HttpClient将文件上传到Ubuntu的特定路径

java - 设计/实现...最有可能使用 AJAX

尝试连接 GAE/Java 的 Android SSL 失败

c# - 从 RSA key 对获取私钥/公钥 base64 表示

.net - 无法在 .NET 中解密使用 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 在 Java 中加密

java - 遍历 HashMap

android - 如何在 Android 中实现像 Facebook 和 Google 这样的通用登录

android - Android中两个HandlerThreads之间的同步对象

c# - 在c#中使用公钥加密数据,在php中使用私钥解密数据