PEM到Android中的PublicKey

问题描述 投票:6回答:2

我见过很多类似的问题,但没有什么对我有用。我只是尝试将我从服务器检索到的PEM格式的RSA公钥转换为PublicKeyin Android。谁能指出我正确的方向?

编辑:我已成功使用以下代码将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=

我缺少一些格式或文件类型吗?

java android rsa pem
2个回答
4
投票

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


0
投票

这不回答问题,但我发现内容相关。发布作为答案,因为它不适合作为评论。

PEM vs DER

  • PEM基本上封装了DER编码的证书或密钥。
  • DER是二进制,PEM是文本;例如,可以轻松地将PEM复制粘贴到电子邮件中。
  • PEM的作用是: 使用Base64对DER证书或密钥进行编码 用-----BEGIN <something>----------END <something>-----分隔结果。
  • 密钥或证书是相同的,只是以不同的格式表示。

主要是从ASN.1(wiki)解释。

DER到Android / Java公钥

以下是如何使用密钥工厂从其编码中实例化DSA公钥的示例。假设Alice已收到Bob的数字签名。 Bob还向她发送了他的公钥(采用编码格式)来验证他的签名。 Alice然后执行以下操作:

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

PEM到Android / Java公钥

与为DER完成的操作类似,但事先执行以下操作:

  1. 删除BEGIN / END定界,和
  2. 解码Base64中的内容以获取原始DER。

(问题已经显示了如何执行此操作的代码。)

© www.soinside.com 2019 - 2024. All rights reserved.