2015-02-16 2 views
1

Я пытаюсь прочитать открытый ключ X509, который хранится в формате pem. Я считаю, что этот файл хранится в виде обычного текста, так что я не понимаю, почему бы бросили эту ошибку:Ошибка чтения открытого ключа в формате pem

java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed

Нарушитель строка кода в моем методе OnCreate AssetFileDescriptor:

AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.public_key); 
FileInputStream fis = afd.createInputStream(); 
BufferedReader reader = new BufferedReader((new InputStreamReader(fis))); 

файл public_key хранится в моем разрешении/сырая папка: enter image description here

Полные трассировки стеки заключается в следующем:

02-15 19:58:04.440 27194-27194/? E/MYAPP﹕ exception 
    android.content.res.Resources$NotFoundException: File res/raw/public_key from drawable resource ID #0x7f050000 
      at android.content.res.Resources.openRawResourceFd(Resources.java:1127) 
      at com.m.Crypto.EncryptRSA.getPublicKeyFromPemFormat(EncryptRSA.java:136) 
      at com.m.RSATest.MainActivity.generateSessionKey(MainActivity.java:127) 
      at com.m.RSATest.MainActivity.onCreate(MainActivity.java:75) 
      at android.app.Activity.performCreate(Activity.java:5275) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252) 
      at android.app.ActivityThread.access$800(ActivityThread.java:139) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5103) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed 
      at android.content.res.AssetManager.openNonAssetFdNative(Native Method) 
      at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:436) 
      at android.content.res.Resources.openRawResourceFd(Resources.java:1124) 
            at com.m.Crypto.EncryptRSA.getPublicKeyFromPemFormat(EncryptRSA.java:136) 
            at com.m.RSATest.MainActivity.generateSessionKey(MainActivity.java:127) 
            at com.m.RSATest.MainActivity.onCreate(MainActivity.java:75) 
            at android.app.Activity.performCreate(Activity.java:5275) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2166) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2252) 
            at android.app.ActivityThread.access$800(ActivityThread.java:139) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1200) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5103) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606) 
            at dalvik.system.NativeStart.main(Native Method) 
+0

Пробовал чистую сборку? –

+0

'FileNotFoundException' не имеет ничего общего с кодировкой ключа. Возможно, вы захотите посмотреть папку [Where to place Assets в Android Studio] (http://stackoverflow.com/q/18302603/608639). – jww

+0

@jww - Перемещение файла открытого ключа в папку «Активы» решило мою проблему с небольшой ревизией кода. Я очень смущен, когда вкладывать вещи в сырье против, когда вкладывать их в активы. Если вы опубликуете ответ, я приму его. Спасибо! – Alex

ответ

0

С полным правом на @jww, я решил это, переместив файл открытого ключа в папку с ресурсами. Это потребовало изменения кода:

AssetManager assetManager = context.getAssets(); 
InputStream inputStream = assetManager.open("public_key"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 

И это заставило меня пройти мимо ошибки, о которой я писал. Оттуда это был вопрос чтения файла с BufferedReader.

Любые комментарии по этому поводу оцениваются.

Спасибо, @jww!

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