2012-03-26 100 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