Java 使用公钥的InvalidKeySpecException

Java 使用公钥的InvalidKeySpecException,java,android,security,encryption,public-key-encryption,Java,Android,Security,Encryption,Public Key Encryption,我正在拼命尝试在Android上使用非对称公钥/私钥加密技术对消息进行加密 我在Windows上,使用puttygen生成了一个公钥和私钥。我不确定这有什么区别,但我选择了SSH-2 RSA。这是公钥: AAAAB3NzaC1yc2EAAAABJQAAAQEAh63orUzl0UTd7jj0KNYJg1+kNnty0QHyJu0r Cajf5Kl7qWJaGXPfwsG8Qt3teafs5sv0JBSinab0s/5wfQmd1QPpXTMP93Wc4ucp 1VC/9B2o8XVi4fKoGT

我正在拼命尝试在Android上使用非对称公钥/私钥加密技术对消息进行加密

我在Windows上,使用puttygen生成了一个公钥和私钥。我不确定这有什么区别,但我选择了SSH-2 RSA。这是公钥:

AAAAB3NzaC1yc2EAAAABJQAAAQEAh63orUzl0UTd7jj0KNYJg1+kNnty0QHyJu0r
Cajf5Kl7qWJaGXPfwsG8Qt3teafs5sv0JBSinab0s/5wfQmd1QPpXTMP93Wc4ucp
1VC/9B2o8XVi4fKoGTehB48yrSfI6KF2AIeASM1jUswydKxsuS4AS2mLGV/HuoKD
huMfCsRc8qK5zGQfVCoZTbQ66Z1yKdAzxMUuGmiTp7pVsle/P/UGbm6yFiee5r1/
dOR2CDyR6CP09Jaj7KSGfGuwPryCXPjEce1oCbN/FlLHVb7T1B5f6xhq+oY+Ij13
1IZPfShV8cs2kYKjsle2s23V5urSdWFv2tEcSJcpkUm2FlPdQw==
我已将其复制到主/assets文件夹中的文本文件中。我是这样读的:

InputStream input = context.getAssets().open(filename);
然后通过相当标准的ByteArrayOutputStream方法将其读入字节数组

然后我尝试将其转换为公钥:

public static PublicKey getPublicKey(byte[] keyBytes){
    PublicKey publicKey = null;

    if(keyBytes != null) {

        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
        KeyFactory kf = null;
        try {
            kf = KeyFactory.getInstance("RSA");
            publicKey = kf.generatePublic(spec);
        } catch (NoSuchAlgorithmException e) {
            Log.e(TAG, "NoSuchAlgorithmException");
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            Log.e(TAG, "InvalidKeySpecException " + e.getMessage());
            e.printStackTrace();
        }
    }

    return publicKey;
}
问题是我不断地遇到这个错误:

InvalidKeySpecException java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
我已经攻击这几个小时了,似乎无法摆脱它。欢迎提出任何建议

我也尝试过Base64:

byte[] tempNewKey = Base64.decode(keyBytes, Base64.DEFAULT);
这没什么区别,我也试过使用

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(module), new BigInteger(exponent));
但是putty没有告诉我关于指数的任何事情?如果我继续使用这个方法,我不会得到同样的错误,但是如果我尝试用我的私钥解密,我只会得到胡言乱语


真希望你能帮忙。非常感谢

SSH密钥不是X509兼容的密钥。它们以SSH专有格式存储。您需要一个支持SSH的库来检索键值

如果不需要SSH功能,则可以在Java中生成密钥(使用
keytool
命令行或
KeyPairGenerator


或者,也可以使用外部应用程序或库,例如
openssl
命令行。对于openssl,请指定DER作为输出。Java希望
X509EncodedKeySpec
的结构为DER编码的
SubjectPublicKeyInfo

是否需要使用SSH密钥?SSH密钥不是X509编码的,因此unl如果你使用SSH兼容库,你可能会永远尝试…你可以用Java本身生成密钥,也可以使用OpenSSL DER编码密钥。嗨,Maarten,非常感谢你的帮助。不,不需要使用SSH,任何私钥/公钥都可以。我试着用keytool-genkey等创建一个密钥。这似乎有效,但我的代码中的错误仍然是一样的?这是一个相当普遍的异常。如果没有更多信息,很难看出这次错误的原因。等一下,我会回答这个问题,然后你可以问一个新的问题,否则问题将不会是具体的。我对任何这样做的人的建议是注意Maarten所说的SSH密钥不会出现错误不起作用。您需要下载openssl,然后按照以下步骤以java就绪格式生成SSL公钥/私钥: