2012-03-26 66 views
4

我试图在Android中以PKCS#1的形式生成RSA公钥。在Android中以PKCS#1格式在Android中生成RSA密钥

这里有这个问题几乎如出一辙:Generating RSA keys in PKCS#1 format in Java

笔者从来没有一个答案回答,虽然。我经历了答案,但我一直无法找到有效的东西。我得出结论(除非别人有不同的答案),必须用Bouncy Castle来完成。我在充气城堡遇到的唯一问题实际上是在Android中使用它。我“似乎”已经正确地导入了jar(我说“看起来”,因为我以前从来没有做过,但这是一个相当痛苦的过程,并且我在Eclipse中没有出错),但是,我在log cat 。

03-25 22:25:58.780: E/AndroidRuntime(9171): java.lang.NoClassDefFoundError: org.bouncycastle.jce.provider.BouncyCastleProvider 
+2

在Android中使用BouncyCastle是非常棘手的,因为Android已经在内部使用了BouncyCastle。 SpongyCastle(https://www.google.com.au/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCMQFjAA&url=https%3A%2F%2Fgithub.com%2Frtyley%2Fspongycastle&ei=Yt9vT_C0G6O5iQfJ8e2TBg&usg=AFQjCNGhIK5nkAxRvqDovIe8E8RMtCaa6Q&cad= rja)是由于这个原因而创建的,对我来说工作得非常好(虽然我还没有试过你的情况) – Carsten 2012-03-26 03:17:03

回答

5

两个可能的答案。

如果您想按照自己的方式行事,请尝试用这个方法解决NoClassDefFoundErrorandroid eclipse updated and now app crashes when it trys to run

您也可以改用JSch。我自己在android上可靠地工作。 RSA Encryption forceclosing before generating public/private keys

编辑:下面是使用JSch生成RSA类型密钥对的一个示例。我认为它是PKCS#1,但我对标准不够熟悉。 relevant javadoc就是我要做的。

/** 
* Load or generate a RSA keypair to use as a client for the given JSch. 
*/ 
public boolean registerKeyPair(JSch jSch) {    
    new File(getRootFolder().getAbsolutePath() + "/.ssh").mkdirs(); 

    File privateKey = new File(getRootFolder().getAbsolutePath() + "/.ssh/id_rsa"); 
    File publicKey = new File(getRootFolder().getAbsolutePath() + "/.ssh/id_rsa.pub"); 
    if (!privateKey.exists() || !publicKey.exists()) {   
     try { 
      KeyPair keyPair = KeyPair.genKeyPair(jSch, KeyPair.RSA); 
      keyPair.writePrivateKey(privateKey.getAbsolutePath()); 
      keyPair.writePublicKey(publicKey.getAbsolutePath(), "Machine Shop"); 
      return true; 
     } catch (JSchException e) { 
      Log.e("genKeyPair(RSA)", Log.getStackTraceString(e)); 
     } catch (FileNotFoundException e) { 
      Log.e("genKeyPair(RSA)", Log.getStackTraceString(e)); 
     } catch (IOException e) { 
      Log.e("genKeyPair(RSA)", Log.getStackTraceString(e)); 
     } 
     return false;   
    }  

    try { 
     jSch.addIdentity(privateKey.getAbsolutePath()); 
     return true; 
    } catch (JSchException e) { 
     Log.w("jSch.addIdentity", Log.getStackTraceString(e)); 
     return false;   
    } 

} 

编辑:假设Eclipse。在构建路径中包含JSch jar file,最好作为本地jar(比如在lib文件夹中)。请务必在“订购和导出”选项卡上进行检查。

现在刷新您的项目。

+0

我想我会去追求BouncyCastle错误,但是,http://www.jcraft.com/jsch/ doesn'似乎没有提及PKCS#1的任何内容,或者我只是忽略它? – EGHDK 2012-03-26 02:47:34

+0

我相信它的确如此,但这只是看着这个:http://epaul.github.com/jsch-documentation/javadoc/com/jcraft/jsch/KeyPairGenRSA.html。无论哪种情况,我都用一个例子更新了我的答案。让我知道它是不是PKCS#1,我会更新它! – sastraxi 2012-03-26 02:53:10

+0

对不起,老实说,我不知道如何去“导入”Jsch到我的应用程序中。帮助不大? – EGHDK 2012-03-26 03:01:32

相关问题