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
结构
我正拼命尝试在 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
.
SubjectPublicKeyInfo
结构