Saving the public key in sharedPreferences and retrieving it

I am trying to use encryption data using RSA. So far so good. I can generate Private-Public keys, I can encrypt and decrypt the string successfully. Now I want to save the public key in SharedPreference. I can save it as a string. I can get it as a string. I need to convert it to Key in order to go to cipher. Conversion from String to the original format does not occur.

This is what I tried

        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);

Here I ran into a problem in cipher.init (Cipher.ENCRYPT_MODE, publicKey); publicKey contains the saved PublicKey extracted from SahredPreferences. This is a String type! How to convert it to Key?

PS: , , .

0
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", "");      
    }
+2

, : -

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", "");
+1

Source: https://habr.com/ru/post/1526480/


All Articles