2013-03-19 57 views
4

我有一個RSA加密和解密的問題。我正在開發Android,並希望外包RSA加密和解密。在我試圖外包之前,我的源代碼運行良好。外包RSA加密和解密的問題

我創建了一個私鑰和公鑰,並將其保存爲private.key和public.key。該錯誤是由這種方法ClassNotFoundException異常:

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

我看着logcat的和得到這個錯誤信息:

E/ClassNotFound(1205): ClassNotFound 
03-19 13:54:52.176: E/Errro(1205): Error: 
com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey 
03-19 13:54:52.176: E/error(1205): java.lang.ClassNotFoundException: 
com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey 

我希望你明白我的問題,因爲英語不是我的母語。

編輯:我發現問題不是由外包代碼造成的。所以我想這個話題可以被標記爲已解決。

+2

僅供參考 - 您的日誌非常奇怪。您可能只需要一個包含Log.e(TAG,「Error loading key」,e);'的catch(Exception e)'語句,其中'TAG'是一個在別處定義的靜態字符串,例如'private static final String TAG = MyActivity.class.getName();'。 – 2013-03-20 08:20:46

+0

請編輯您的問題與您添加到我現在刪除的答案的評論。也許有人可以幫助你。 – 2013-03-22 10:50:49

+0

沒有「標記爲已解決」之類的東西。但是,如果問題不在幫助其他人,您可以刪除該問題。 – 2013-04-05 15:15:16

回答

0

RSAPublicKeyRSAPrivateKey是接口。當您收到Key時,您實際上會收到此接口的加密提供程序的實施。這些提供者在不同的Java平臺上有所不同(儘管至少官方Android/Dalvik甚至不是Java平臺)。所以,除非你在同一個平臺上工作,否則你不應該期望序列化工作。

但是,有一些方法可以在Java中序列化公鑰和私鑰; Key接口包含getEncoded()方法,該方法返回密鑰的最常見二進制編碼。在RSAPublicKey的情況下,這是X5.09 SubjectKeyIdentifier中的PKCS#1編碼。在RSAPrivateKey的情況下,這是內部圍繞PKCS#1定義的結構的PKCS#8編碼。這些可以使用X509EncodedKeySpecPKCS8EncodedKeySpec表示並使用RSA KeyFactory轉換回密鑰。

請注意,如果您撥打getEncoded,私鑰不會被加密。通常情況下,你不想運輸私人密碼,所有,如果你確實應該加密它們。您可以使用Cipher.wrapCipher.unwrap方法執行此操作。