2015-01-29 3 views
2

Я отчаянно пытаюсь зашифровать сообщение, используя асимметричную криптографию открытого/закрытого ключа на 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

+0

Нужно ли использовать ключи SSH? Ключи SSH не кодируются X509, поэтому, если вы не используете библиотеку, совместимую с SSH, пытаясь навсегда ... Вы можете либо сгенерировать ключи в самой Java, либо в качестве альтернативы использовать кодировку OpenSSL DER ключи. –

+0

Привет, Маартен, большое спасибо за помощь. Нет, не нужно использовать SSH, любой частный/открытый ключ будет делать. Я попытался создать ключ, как вы говорите, используя keytool -genkey и т. Д. Это, похоже, работает, но ошибка в моем коде все-таки остается прежней? – James

+0

Это довольно общее исключение. Без дополнительной информации трудно понять, в чем причина ошибки * на этот раз *. Подождите, я отвечу на этот вопрос, а затем вы можете попросить новый, иначе вопрос не будет конкретным. –

ответ

0

Ключи SSH не совместимы с X509. Они хранятся в собственном формате SSH. Для получения значения ключа вам понадобится SSH-способная библиотека.

Если функциональные возможности SSH не требуется, то можно генерировать ключи в Java (с помощью keytool командной строки или KeyPairGenerator.

В качестве альтернативы также можно использовать внешние приложения или библиотеки, такие как openssl командной строки. В случае OpenSSL укажите DER в качестве вывода. Java ожидает, что DER закодирована структура SubjectPublicKeyInfo для X509EncodedKeySpec.

Смежные вопросы