1

我正在开发一个安卓应用程序。不幸的是我有一个兼容性问题。我的源代码适用于固件 4.1,但使用固件 2.2 的设备会崩溃。该错误似乎是由 ObjectInputStream 引起的“ClassNotFoundException”。

我的加密和解密源代码:

private Key getPublicKey() {
    try {
        InputStream fis = activity.getResources().openRawResource(R.raw.publick);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Key RSApublicKey = (Key) ois.readObject();
        return RSApublicKey;
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

private Key getPrivateKey() {
    try {
        InputStream fis = activity.getResources().openRawResource(R.raw.privatek);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Key RSAprivateKey = (Key) ois.readObject();
        return RSAprivateKey;
    }
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        Log.e("error", "Error: " + e);
        e.printStackTrace();
    }
    return null;
}

public byte[] encrypt(String data) {
    byte[] encrypted = null;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, getPublicKey());
        encrypted = cipher.doFinal(data.getBytes());
    }
    catch (IllegalBlockSizeException e) {
            e.printStackTrace();
    }
    catch (BadPaddingException e) {
        e.printStackTrace();
    }
    catch (InvalidKeyException e) {
        e.printStackTrace();
    }
    catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    catch (NoSuchPaddingException e) {
        e.printStackTrace();
    }
    catch (NoSuchProviderException e) {
        e.printStackTrace();
    }
    return encrypted;
}

public String decrypt(byte[] encrypted) {
    byte[] decrypted = null;
    try {
        Cipher cipher;
        cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, getPrivateKey());
        decrypted = cipher.doFinal(encrypted);
    }
    catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    catch (NoSuchPaddingException e) {
        e.printStackTrace();
    }
    catch (InvalidKeyException e) {
        e.printStackTrace();
    }
    catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    }
    catch (BadPaddingException e) {
        e.printStackTrace();
    }
    catch (NoSuchProviderException e) {
        e.printStackTrace();
    }
    return new String(decrypted);
}

logcat中的错误:

03-23 10:13:19.706: E/Error(427): Error: java.lang.ClassNotFoundException: com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey

你有什么想法,我怎样才能让它与 android 2.2 一起工作?

4

2 回答 2

0

好吧,如果它适用于 4.1+ 但不适用于 2.2,我猜它是 2.2 之后包含的来自 android 的类。您可以通过尝试使用 android 2.2 编译一个使用此类的项目来测试这一点,看看是否可以。如果是这种情况,只需找到它并将其包含在您的项目中。

于 2013-03-23T11:48:27.350 回答
0

您最好使用该Key.getEncoded()方法来序列化密钥。Key.getFormat()已经暗示 RSA 私钥应默认为 PKCS#8 编码。

然后,您可以使用PKCS8EncodedKeySpec类和 an 的实例"RSA" KeyFactory来反序列化生成的字节数组。

序列化的密钥可能无法在不同的实现中正常工作PrivateKey(正如您现在已经发现的那样),并且 PKCS#8 是一个定义明确且经常使用的标准。

于 2013-03-23T16:16:22.033 回答