2010-07-30 6 views
2

J'ai un problème lorsque j'essaie de lire un fichier .key. Ce fichier est créé par un java normal (J2SE) et je le lis depuis l'application android. Quand je lis ce fichier à partir d'Android il ne me donne rien et j'ai fait un peu de débogage et j'ai remarqué qu'il ne peut pas lire le fichier. J'ai aussi vérifié si je peux lire le fichier (en utilisant file.canRead()) et il semble que je ne peux pas.) Remarquez que j'ai créé l'application Java normale (J2SE) avec le même code et cela a fonctionné avec succèslecture de fichier .key android

Le code que j'ai utilisé est la suivante:

public KeyPair LoadKeyPair(String algorithm, String publicFileName, String privateFileName) { 
    // Read Public Key. 
    PublicKey publicKey = null; 
    PrivateKey privateKey = null; 
    try { 
    File filePublicKey = new File(publicFileName); 
    FileInputStream fis = new FileInputStream(publicFileName); // The program stops here 
    byte[] encodedPublicKey = new byte[(int) filePublicKey.length()]; 
    fis.read(encodedPublicKey); 
    fis.close(); 

// Read Private Key. 
File filePrivateKey = new File(privateFileName); 
fis = new FileInputStream(privateFileName); 
byte[] encodedPrivateKey = new byte[(int) filePrivateKey.length()]; 
fis.read(encodedPrivateKey); 
fis.close(); 

// Generate KeyPair. 
KeyFactory keyFactory = KeyFactory.getInstance(algorithm); 
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(
encodedPublicKey); 
publicKey = keyFactory.generatePublic(publicKeySpec); 

PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(
encodedPrivateKey); 
privateKey = keyFactory.generatePrivate(privateKeySpec); 

} catch (FileNotFoundException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (NoSuchAlgorithmException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (InvalidKeySpecException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
return new KeyPair(publicKey, privateKey); 
} 
+0

Carte SD? – Macarse

+0

il est dans le même répertoire de l'application android – malak

Répondre

0

est un fichier .key comme un fichier .pem

Si oui, je viens de faire quelque chose comme ça, parce que PemReader est BouncyCastleProvider, et qui est un gâchis trop?! code pour trop peu de choses que je veux utiliser

if(mKey==null){ 
     BufferedReader pubFile = new BufferedReader(new InputStreamReader(mCtx.getResources().openRawResource(R.raw.public.pem))); 
     try { 
      String line = new String(); 
      StringBuilder key = new StringBuilder(); 
      while((line = pubFile.readLine())!= null){ 
       if(!line.contains("----")){ 
        key.append(line); 
       } 
      } 
      mKey = key.toString(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       pubFile.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

Comme vous pouvez le voir, j'ai mon public.pem dans le dossier res/raw/de mon application. Bien sûr, je n'ai pas de .pem avec la clé privée dedans. Je signe avec ma clé publique et vérifie que l'information a été signée avec une clé publique faite à partir de la clé privée que je garde sur mon serveur.

Espérons que cela répond à votre question et soit suffisamment clair.

0

Avez-vous ajouté dans le manifeste la ligne suivante? D'où lisez-vous le fichier?

<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/> 
+1

Où est android.permission.READ_INTERNAL_STORAGE documentd. Je ne pouvais pas le trouver dans Manifets.permission. –

+0

Vous devez ajouter cette ligne dans le manifeste si elle n'existe pas. – Dave

+0

Cette autorisation n'existe pas (voir tous les existants ici: http://developer.android.com/reference/android/Manifest.permission.html). Toutefois, notez que READ_EXTERNAL_STORAGE existe depuis l'API 16. –