使用公钥的InvalidKeySpecException

时间:2015-01-29 15:39:46

标签: java android security encryption public-key-encryption

我正在拼命尝试在Android上使用非对称公钥/私钥加密来加密邮件。

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

AAAAB3NzaC1yc2EAAAABJQAAAQEAh63orUzl0UTd7jj0KNYJg1+kNnty0QHyJu0r
Cajf5Kl7qWJaGXPfwsG8Qt3teafs5sv0JBSinab0s/5wfQmd1QPpXTMP93Wc4ucp
1VC/9B2o8XVi4fKoGTehB48yrSfI6KF2AIeASM1jUswydKxsuS4AS2mLGV/HuoKD
huMfCsRc8qK5zGQfVCoZTbQ66Z1yKdAzxMUuGmiTp7pVsle/P/UGbm6yFiee5r1/
dOR2CDyR6CP09Jaj7KSGfGuwPryCXPjEce1oCbN/FlLHVb7T1B5f6xhq+oY+Ij13
1IZPfShV8cs2kYKjsle2s23V5urSdWFv2tEcSJcpkUm2FlPdQw==

我已将其复制到我的main / 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并没有告诉我关于指数的任何事情?如果我继续使用这种方法,我不会得到同样的错误,但是如果我尝试使用我的私钥进行解密,我就会感到胡言乱语。

真的希望你能提供帮助。非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

或者,也可以使用外部应用程序或库,例如openssl命令行。在OpenSSL的情况下,将DER指定为输出。 Java期望SubjectPublicKeyInfo的DER编码X509EncodedKeySpec结构。