2010-07-30 67 views
2

我有問題,當我嘗試讀取.key文件。這個文件是由一個普通的java(J2SE)創建的,我從android應用程序中讀取它。當我從android讀取這個文件時,它沒有給我提供任何幫助,而且我做了一些調試,我發現它無法讀取文件。我也檢查過我是否可以讀取該文件(使用file.canRead()),看起來我不能)。注意,我使用相同的代碼創建了普通的Java應用程序(J2SE),並且它的工作成功。閱讀.key文件android

我已經使用的代碼是這樣的:

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

你在哪裏閱讀文件? SD卡? – Macarse 2010-07-30 21:19:26

+0

它位於android應用程序的同一目錄 – malak 2010-07-30 23:07:24

回答

0

是一個.key文件就像一個.PEM文件

如果是這樣,我只是做這樣的事情,因爲PemReader是BouncyCastleProvider,這是一個爛攤子太多了?!代碼太少,我想用

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(); 
      } 
     } 
    } 

正如你所看到的,我的應用程序中的res/raw /文件夾中有我的public.pem。當然,我沒有一個.pem的私鑰在裏面。我用我的公鑰簽名並驗證信息是使用由我保存在我的服務器上的私鑰生成的公鑰簽署的。

希望能回答你的問題,並且足夠清楚。

0

您是否在Manifest中添加了以下行?

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

其中是android.permission.READ_INTERNAL_STORAGE記錄。我在Manifets.permission中找不到它。 – 2012-02-19 00:37:30

+0

如果不存在,則需要在Manifest中添加此行。 – Dave 2012-02-28 13:29:38

+0

此權限不存在(請參閱所有現有的權限:http://developer.android.com/reference/android/Manifest.permission.html)。 但是,請注意,自API 16以來,存在READ_EXTERNAL_STORAGE。 – 2012-10-27 20:06:32