2015-11-06 58 views
0

我试图使用RSA加密数据。到目前为止,一切都很好。我可以生成私钥公钥,我可以加密并成功解密字符串。 现在我想要在SharedPreference中存储公钥。我可以将它存储为字符串。我可以检索它作为字符串。我需要将它转换为Key,传递给密码。没有发生从字符串到原始格式的转换。将公共密钥存储在sharedPreferences中,并检索它

这就是我想

 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); //generate key using RSA 
     KeyPair keypair=keyPairGenerator.generateKeyPair(); //get generated key 
     Cipher cipher =Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     SharedPreferences sharedPreferences=context.getSharedPreferences("rsakey", MODE_PRIVATE);//Initializing SharedPerference 



     SharedPreferences.Editor editor=sharedPreferences.edit(); 
     editor.putString("public",keypair.getPublic().toString()); 
     editor.putString("private",keypair.getPrivate().toString()); 
     editor.commit();//store key in sharedpreference 
     final String sampletext="abcde"; 

     //getting stored key 
     String publicKey = sharedPreferences.getString("public", null); 
     String privateKey = sharedPreferences.getString("private", null); 



     //publicKey must of type "KEY", so i need to convert publicKey to KEY, But its not happening 
     cipher.init(Cipher.ENCRYPT_MODE,publicKey); 
     byte[] encryptedtext=cipher.doFinal(sampletext.getBytes()); 
     String encrypted_text=new String(Base64.encode(encryptedtext,Base64.NO_WRAP)); 


     //privateKey is string, it supposed to be of type KEY 
     cipher.init(Cipher.DECRYPT_MODE,privateKey); 
     encryptedtext=Base64.decode(encrypted_text.getBytes(), Base64.NO_WRAP); 
     encryptedtext=cipher.doFinal(encryptedtext); 

     String decrypted_text=new String(encryptedtext); 

在这里,我面临着cipher.init(Cipher.ENCRYPT_MODE,公钥)的问题; publicKey包含存储的PublicKey,从SahredPreferences中提取。它是String类型的!如何将其转换为密钥?

PS:这只是示例代码,在现实生活中我将把私钥存储在服务器中,公钥将发给用户。

回答

2

希望这有助于你

public void generateKeys(){ 
     try { 
    SharedPreferences SP; 
    SharedPreferences.Editor SPE; 
    KeyPairGenerator generator; 
       generator = KeyPairGenerator.getInstance("RSA", "BC"); 
       generator.initialize(256, new SecureRandom()); 
       KeyPair pair = generator.generateKeyPair(); 
       pubKey = pair.getPublic(); 
       privKey = pair.getPrivate();    
       byte[] publicKeyBytes = pubKey.getEncoded(); 
       String pubKeyStr = new String(Base64.encode(publicKeyBytes)); 
       byte[] privKeyBytes = privKey.getEncoded(); 
       String privKeyStr = new String(Base64.encode(privKeyBytes));    
       SPE = SP.edit(); 
       SPE.putString("PublicKey", pubKeyStr); 
       SPE.putString("PrivateKey", privKeyStr);   
       SPE.commit(); 

    } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     }   
    } 

public PublicKey getPublicKey(){ 
     String pubKeyStr = SP.getString("PublicKey", "");  
     byte[] sigBytes = Base64.decode(pubKeyStr); 
     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes); 
     KeyFactory keyFact = null; 
     try { 
      keyFact = KeyFactory.getInstance("RSA", "BC"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     } 
     try { 
      return keyFact.generatePublic(x509KeySpec); 
     } catch (InvalidKeySpecException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    public String getPublicKeyAsString(){ 
     return SP.getString("PublicKey", "");  
    } 
    public PrivateKey getPrivateKey(){ 
     String privKeyStr = SP.getString("PrivateKey", ""); 
     byte[] sigBytes = Base64.decode(privKeyStr); 
     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes); 
     KeyFactory keyFact = null; 
     try { 
      keyFact = KeyFactory.getInstance("RSA", "BC"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     } 
     try { 
      return keyFact.generatePrivate(x509KeySpec); 
     } catch (InvalidKeySpecException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    public String getPrivateKeyAsString(){ 
     return SP.getString("PrivateKey", "");  
    } 
+0

谢谢,我会尽量让你知道! – Darsh

1

试试这个代码,我用这个代码: -

private static final int MODE_PRIVATE = 0; 
Editor editor; 
SharedPreferences pref; 

    pref = getApplicationContext().getSharedPreferences("MyPref", 
      MODE_PRIVATE); 
    editor = pref.edit(); 



    editor.putString("full_name", edtfullname.getText() 
          .toString()); 
    editor.commit(); 

    //another activity or class you can access that 

    full_name = pref.getString("full_name", ""); 
+0

这是非常短的代码,如果你想阅读更多关于共享首选项,然后按照此链接http://androidbeginersamit.blogspot.in/2014/08/shared-preference-in-android-store-data.html – Amitsharma

+0

谢谢,但这是不是我正在寻找。我可以存储和检索字符串。你如何存储公钥并检索它 – Darsh

+0

@DARSH如果你需要在公共场所存储,那么你不需要保存共享prefrence,你可以保存在全局变量中,那么你可以通过使用public static弦..... – Amitsharma

相关问题