InvalidKeySpecException 使用 public 键

InvalidKeySpecException using public key

我正拼命尝试在 Android.

上使用非对称 public / 私钥加密来加密消息

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

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 密钥:

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 结构