我正在拼命尝试在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并没有告诉我关于指数的任何事情?如果我继续使用这种方法,我不会得到同样的错误,但是如果我尝试使用我的私钥进行解密,我就会感到胡言乱语。
真的希望你能提供帮助。非常感谢
答案 0 :(得分:0)
SSH密钥不是X509兼容密钥。它们以SSH专有格式存储。您需要一个支持SSH的库来检索密钥值。
如果不需要SSH功能,则可以使用keytool
命令行或KeyPairGenerator
在Java中生成密钥。
或者,也可以使用外部应用程序或库,例如openssl
命令行。在OpenSSL的情况下,将DER指定为输出。 Java期望SubjectPublicKeyInfo
的DER编码X509EncodedKeySpec
结构。