【问题标题】:PEM to PublicKey in AndroidPEM 到 Android 中的 PublicKey
【发布时间】: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" 我应该如何继续?

标签: java android rsa pem


【解决方案1】:

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

PEM 与 DER

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

主要是从ASN.1(wiki)转述。

DER 到 Android/Java 公钥

以下是如何使用密钥工厂的示例,以便 从其编码实例化 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

PEM 到 Android/Java 公钥

类似于对 DER 所做的,但事先执行以下操作:

  1. 删除BEGIN/END 分隔符,并且
  2. 对Base64中的内容进行解码,得到原始DER。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请帮助我如何加密 Android 中 pem 中的公钥。我找不到任何解决方案:-(
    • @Chandru - 为什么要加密公钥?
    猜你喜欢
    • 2018-01-09
    • 2023-04-01
    • 2019-08-05
    • 2011-10-25
    • 2022-07-08
    • 2022-08-23
    • 1970-01-01
    • 2012-06-09
    • 2012-02-12
    相关资源
    最近更新 更多