Java PEM到Android中的公钥

Java PEM到Android中的公钥,java,android,rsa,pem,Java,Android,Rsa,Pem,我见过许多类似的问题,但没有什么对我有效。我只是尝试将从服务器检索到的PEM格式的RSA公钥转换为Android中的公钥。谁能给我指出正确的方向吗 编辑: 我已经成功地使用以下代码将PEM转换为公钥,但是在对消息进行编码时,我得到了意外的输出 public PublicKey getFromString(String keystr) throws Exception { // Remove the first and last lines String

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

编辑: 我已经成功地使用以下代码将PEM转换为公钥,但是在对消息进行编码时,我得到了意外的输出

 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=

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

回答我自己的问题……第一个输出是十六进制,第二个输出是64进制。只需将return语句更改为
returnnewstring(Base64.encode(encryptedBytes))

你会很好的

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

PEM vs DER
  • PEM基本上封装了DER编码的证书或密钥
  • DER是二进制的,PEM是文本;例如,PEM可以很容易地复制粘贴到电子邮件中
  • PEM所做的是:
  • 使用Base64对DER证书或密钥进行编码,以及
  • ----开始---
    ----结束---
    分隔结果
  • 密钥或证书是相同的,只是用不同的格式表示
主要是从

DER到Android/Java公钥 以下是如何使用密钥工厂来 从其编码实例化DSA公钥。假设爱丽丝有 收到鲍勃的数字签名。鲍勃还把他的公开信寄给了她 验证其签名的密钥(编码格式)。爱丽丝接着表演 以下行动:

X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);

请注意,
bobencodedsubkey
在此示例中是按顺序编码的

PEM到Android/Java公钥 类似于为DER所做的操作,但请事先执行以下操作:

  • 删除
    开始
    /
    结束
    定界,然后
  • 对Base64中的内容进行解码以获得原始DER

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

    您在中尝试过这种方法吗?我需要能够在应用程序中完成所有操作…不使用命令行如果您需要base64输出,为什么要将密钥解码为行中的二进制
    byte[]encoded=base64.decode(pubKeyPEM)?这是
    X509EncodedKeySpec
    @cph2117的预期输入。我正在尝试将您的代码用于我的
    .pem
    文件,但是,包含公钥的我的
    .pem
    文件不包含字符串
    “----开始公钥------\n”
    我应该如何继续?请帮助我如何加密Android中pem中的公钥。我找不到任何解决方案:-(@Chandru-为什么要加密公钥?