外包RSA加密和解密的问题

时间:2013-03-19 14:01:08

标签: android encryption rsa

我遇到RSA加密和解密问题。我正在开发android,并希望外包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

我希望你理解我的问题,因为英语不是我的母语。

编辑:我发现问题不是外包代码造成的。所以我想这个主题可以标记为已解决。

1 个答案:

答案 0 :(得分: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方法执行此操作。