将公共密钥存储在sharedPreferences中,并检索它
我试图使用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:这只是示例代码,在现实生活中我将把私钥存储在服务器中,公钥将发给用户。
希望这有助于你
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", "");
这是非常短的代码,如果你想阅读更多关于共享首选项,然后按照此链接http://androidbeginersamit.blogspot.in/2014/08/shared-preference-in-android-store-data.html – Amitsharma
谢谢,但这是不是我正在寻找。我可以存储和检索字符串。你如何存储公钥并检索它 – Darsh
@DARSH如果你需要在公共场所存储,那么你不需要保存共享prefrence,你可以保存在全局变量中,那么你可以通过使用public static弦..... – Amitsharma
谢谢,我会尽量让你知道! – Darsh