2010-07-30 5 views
2

.key 파일을 읽으 려 할 때 문제가 있습니다. 이 파일은 일반 Java (J2SE)에 의해 만들어지며 android 응용 프로그램에서 읽습니다. 내가 안드로이드 에서이 파일을 읽을 때 그것은 나에게 아무것도주지 않는다. 그리고 나는 약간의 디버깅을했다. 그리고 나는 그것이 파일을 읽을 수 없다는 것을 알아 차렸다. 또한 내가 파일을 읽을 수 있는지 확인했다면 (file.canRead())을 사용하면 확인할 수 없다.) 나는 정상적인 자바 애플리케이션 (J2SE)을 동일한 코드로 만들었고 성공적으로 작동했다는 것을 알았고 성공적으로 작동했다는 것을 주목하라..key 파일 읽기 android

내가 사용한 코드 PemReader이 BouncyCastleProvider에 있기 때문에 난 그냥, 같은 것을 할,

그렇다면

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

+0

안드로이드 애플 리케이션의 동일한 디렉토리에 있습니다 – malak

답변

0

단지가 .pem 파일과 같은 .KEY 파일이며, 그것은 너무 엉망입니다 :이입니다! 너무 적은 것들에 대한 코드를 사용하고 싶습니다.

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

보시다시피 내 Public.pem은 내 애플리케이션의 res/raw/폴더에 있습니다. 물론 개인 키가있는 .pem이 없습니다. 내 공개 키로 서명하고 정보가 내 서버에 보관 된 개인 키로 만든 공개 키로 서명되었는지 확인합니다.

질문에 대한 답변이 충분하고 명확합니다.

0

다음 줄을 매니페스트에 추가 했습니까?

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

android.permission.READ_INTERNAL_STORAGE는 어디에 있습니까? 매니 페츠에서 찾지 못했습니다. 허가. –

+0

존재하지 않는 경우이 줄을 Manifest에 추가해야합니다. – Dave

+0

이 권한이 없습니다 (기존의 모든 항목 참조 : http://developer.android.com/reference/android/Manifest.permission.html). 그러나 API 16부터 READ_EXTERNAL_STORAGE가 존재합니다. –