我正在拼命尝试在 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 没有告诉我任何关于指数的信息?如果我继续使用这种方法,我不会得到相同的错误,但如果我尝试用我的私钥解密,我只会得到乱码。
真心希望你能帮忙。非常感谢