Java PEM到Android中的公钥
我见过许多类似的问题,但没有什么对我有效。我只是尝试将从服务器检索到的PEM格式的RSA公钥转换为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转换为公钥,但是在对消息进行编码时,我得到了意外的输出
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-为什么要加密公钥?