在sharedPreferences中存储公钥,并检索它

我正在尝试使用RSA加密数据。 到目前为止一切都很好。 我可以生成Private-Public密钥,我可以成功加密和解密字符串。 现在我想在SharedPreference中存储公钥。 我可以把它存储为字符串。 我可以将其检索为字符串。 我需要将其转换为Key,以传递给密码。 不会发生从字符串到原始格式的转换。

这是我试过的

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中提取的存储的PublicKey。 它是String类型! 如何将其转换为密钥?

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

希望这对你有所帮助

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

尝试此代码我使用此代码: –

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