【问题标题】:reading .key file android读取.key文件android
【发布时间】:2010-07-30 21:07:53
【问题描述】:

我在尝试读取 .key 文件时遇到问题。这个文件是由一个普通的 java (J2SE) 创建的,我从 android 应用程序中读取它。当我从 android 读取这个文件时,它什么也没给我,我做了一些调试,我注意到它无法读取文件。我还检查了我是否可以读取文件(使用file.canRead()),但似乎我不能。请注意,我使用相同的代码创建了普通的 Java 应用程序(J2SE)并且它成功运行。

我使用的代码是这样的:

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

【问题讨论】:

  • 您从哪里读取文件? SD卡?
  • 和android app在同一目录

标签: android file


【解决方案1】:

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

如您所见,我的 public.pem 在我的应用程序的 res/raw/ 文件夹中。当然,我没有包含私钥的 .pem。我用我的公钥签名,并验证信息是用我保存在服务器上的私钥生成的公钥签名的。

希望能回答您的问题并且足够清楚。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • android.permission.READ_INTERNAL_STORAGE 记录在哪里。我在 Manifets.permission 中找不到它。
    • 如果Manifest中不存在此行,则需要添加。
    • 此权限不存在(在此处查看所有现有权限:developer.android.com/reference/android/…)。但是,请注意 READ_EXTERNAL_STORAGE 从 API 16 开始就存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2011-05-21
    相关资源
    最近更新 更多