2014-04-10 21 views
1

我搜索了很多,但沒有找到有用的答案。我開發了java和android安全應用程序。我發現一些問題,當我在PC上創建RSA密鑰時,我將RSA公鑰轉移給了android。當我用android上的公鑰對我的數據進行加密時,我使用PC上的私鑰解密數據,它顯示Badpadding Exception。我在google上搜索這個異常。我發現一些用戶對我有同樣的問題,但答案是沒用的。他們告訴我使用Base64對其進行編碼,但關鍵還是錯誤的。這是我的代碼。Android上的RSA不同於PC

public void generateKeys(){ 
    try { 
     KeyPairGenerator generator; 
     generator = KeyPairGenerator.getInstance("RSA"); 
     generator.initialize(1024, new SecureRandom()); 
     KeyPair pair = generator.generateKeyPair(); 

     pubKey = pair.getPublic(); 
     privKey = pair.getPrivate(); 
     //================================================ 
     System.out.println("My Public KEY "+pubKey.toString()); 
     System.out.println("My Private KEY "+privKey.toString()); 

     byte[]pk_byte = pubKey.getEncoded(); 
     byte[]sk_byte = privKey.getEncoded(); 

      FileOutputStream keyfos_pub = new FileOutputStream(new File(Environment.getExternalStorageDirectory(),"RSAKey/publicKey.txt")); 
      keyfos_pub.write(pk_byte); 
      keyfos_pub.close(); 

      FileOutputStream keyfos_pri = new FileOutputStream(new File(Environment.getExternalStorageDirectory(),"RSAKey/privateKey.txt")); 
      keyfos_pri.write(sk_byte); 
      keyfos_pri.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

} 

當我打印出鍵時,它看起來像這樣。

RSA Private CRT Key 
      modulus: dba017a7653612c53f3a46bb99f5098c7bf9012d06f3d20f8f01a67d17aeefd83070a2ff181468679a2d5abae6f7c074b7b3888a4a57533acc3d2d1dfdd86cdc032d3eafd6cf8423edfa3451333bf1d7377352dd3feb9268032831abd72c5c932fed9b4c667f3da062f4beb7a321f2c434d232ee746885dce13a1656eb42fe6b 
    public exponent: 10001 
    private exponent: 72f10f5019653a5fa6de9e0432e80e4e4ad79fe8ebd99157793598e7a10c7a14000e0310548ee1b14efc6b9ea3a08845cd9a955c22da1f0207c000abd09d83228e05a42f9bd88733afc2a4c1e30770e7ac3c41c55adae734e4f8126da494a88f362d716d6b37a2d7bfbe53824cfb9dc7a0289aa432226bbece49129f47de2a61 
      primeP: efa2665a1e08dce4450ad608e17df1e3650ab2cfc44e9b3b6a346611b270b245e21c28f71971d5062368e66b99297085f23104577e529ef08b263e63387cf17b 
      primeQ: ea9fde740a15d7f68f5aadb72a588f65da3761119b0c73930f111a43d513d19f42185afcd0291f03a9861a7757108f0e83d4d904ddf541a2debd79344387bbd1 
    primeExponentP: 45202ab84a3bb244a2e9fa4dfb861235cf5ae3b3ed63e381a32454613c8127dbe2daceb26103a638ac14418bbe55e6e0acb99910081f9b3bb65824dd08597a6b 
    primeExponentQ: 53ca665a90a37e6e1a822ad9e8309a7da871f0a3a5f8cb69b08ece0f7d90476395ea36cc64d6dab1a72032617e6176859b852f3ff2b8bd091a7d164518fce791 
    crtCoefficient: 695a3707d033aa2474a7a64959589842099a220540167b48f42bbbd1d786d1a84c378f9a1bc0311948287cbf7669aa44156dd9f24bfe88baf931e5da70a06c4 

RSA Public Key 
      modulus: dba017a7653612c53f3a46bb99f5098c7bf9012d06f3d20f8f01a67d17aeefd83070a2ff181468679a2d5abae6f7c074b7b3888a4a57533acc3d2d1dfdd86cdc032d3eafd6cf8423edfa3451333bf1d7377352dd3feb9268032831abd72c5c932fed9b4c667f3da062f4beb7a321f2c434d232ee746885dce13a1656eb42fe6b 
    public exponent: 10001 

我把我的鑰匙到電腦,並打印出它看起來像這樣

Sun RSA private CRT key, 1024 bits 
    modulus:26667287976397870949812555235301 
    public exponent: 65537 
    private exponent: 9980146428442039393666657480590341260299844482325612277626580558453963728645653672535456363067433797990268399780224833064816191126482490562360748269935354262219600344146818595176602910809143102802601846580823241077395526479491554799584457750285244532837191028964347562514222968145677820868899082320352227173 
    prime p:   12299841631131712301068734715117232218530765196368758184959862403767638338760002562429845237522849739220962134079733702092483313582445665328865919334315231 
    prime q:   10854667172235374767842313747899047475769598966944705527971116954964144369647441254504149073040778536441723902849901407264741891511747045046848533162966971 
    prime exponent p: 9681923647204217071082501281466465900019303827612974308340469989251337818636053102684450861548877311242977166683023364260601327205871598989662862911311993 
    prime exponent q: 1654443602597908945419791446477006656323336803344838236704510234877044083623118096514059921732827819407607611968318128037101282547428799502158627916518563 
    crt coefficient: 8339065711012644104593134475846199184972354402766421557421676186133596071951423663692155855342215056476322973047333984032026031966395156454879551656339085 

很清楚,關鍵是改變,因爲有一句話「1024位」出現在密鑰和模塊的數量並不相同

我該如何管理這個問題。我想請一位專業人士幫助我請

回答

0

這確實看起來像一個不同的關鍵。請重試,因爲您可能會發送舊密鑰或其他內容。確保您不重新生成密鑰對,每次都會有所不同。改爲使用私鑰打印出模數BigInteger; BigInteger實例將始終以小數形式打印出來,以便於比較。或者甚至更好,使用BigInteger.toString(16)來獲得十六進制表示。

如果您使用了一個好的隨機數生成器(比如Java中的默認生成器),那麼模數對於密鑰對而言應該是唯一的。因此,它或模數上的SHA1散列通常用於標識密鑰。

-1

它們是一樣的東西,但Android打印出基本16(十六進制),而您的桌面Java打印它以10爲基數(十進制)。您將看到不同實現之間的toString()輸出的變體。

例如,看公開的指數並注意十六進制0x10001等於十進制65537。這個指數通常被稱爲RSA F4。然而,由於該公開指數用於很多密鑰,因此不能用它來區分密鑰。

+0

但是,當我使用這個公鑰在android中加密消息並使用私鑰解密PC上的消息時,它將返回badpaddingexecption或無效密鑰。我該如何解決這個問題。 – user2258408

+0

模數是不同的,因此與其他對不同的密鑰... –