2013-03-19 32 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方法执行此操作。