Я отчаянно пытаюсь зашифровать сообщение, используя асимметричную криптографию открытого/закрытого ключа на Android.InvalidKeySpecException с использованием открытого ключа
Я нахожусь в 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));
Однако шпатлевка не говорит мне ничего о экспоненте? Если я продолжу этот метод, у меня не получится такая же ошибка, но если я попытаюсь и расшифрую свой личный ключ, я просто получу бред.
Надеюсь, вы сможете помочь. Many Thanks
Нужно ли использовать ключи SSH? Ключи SSH не кодируются X509, поэтому, если вы не используете библиотеку, совместимую с SSH, пытаясь навсегда ... Вы можете либо сгенерировать ключи в самой Java, либо в качестве альтернативы использовать кодировку OpenSSL DER ключи. –
Привет, Маартен, большое спасибо за помощь. Нет, не нужно использовать SSH, любой частный/открытый ключ будет делать. Я попытался создать ключ, как вы говорите, используя keytool -genkey и т. Д. Это, похоже, работает, но ошибка в моем коде все-таки остается прежней? – James
Это довольно общее исключение. Без дополнительной информации трудно понять, в чем причина ошибки * на этот раз *. Подождите, я отвечу на этот вопрос, а затем вы можете попросить новый, иначе вопрос не будет конкретным. –