将公钥存储在sharedPreferences中,并检索它 [英] Storing public key in sharedPreferences, and Retrieving it

查看:118
本文介绍了将公钥存储在sharedPreferences中,并检索它的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用RSA使用加密数据。到目前为止,一切都很好。我可以生成私钥,我可以加密和解密字符串成功。
现在我想要存储的公钥在SharedPreference。我可以将其存储为字符串。我可以检索它作为字符串。我需要将其转换为密钥,以传递给密码。



这是我尝试的

  KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA); //使用RSA生成密钥
KeyPair keypair = keyPairGenerator.generateKeyPair(); //获取生成的密钥
密码密码= Cipher.getInstance(RSA / ECB / PKCS1Padding);
SharedPreferences sharedPreferences = context.getSharedPreferences(rsakey,MODE_PRIVATE); //初始化SharedPerference



SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(public,keypair.getPublic()。toString());
editor.putString(private,keypair.getPrivate()。toString());
editor.commit(); //存储key在sharedpreference
final String sampletext =abcde;

//获取存储的键
String publicKey = sharedPreferences.getString(public,null);
String privateKey = sharedPreferences.getString(private,null);



// publicKey必须是KEY类型,所以我需要将publicKey转换为KEY,但它不会发生
cipher.init(Cipher.ENCRYPT_MODE ,公钥);
byte [] encryptedtext = cipher.doFinal(sampletext.getBytes());
String encrypted_text = new String(Base64.encode(encryptedtext,Base64.NO_WRAP));


// privateKey是字符串,它应该是类型KEY
cipher.init(Cipher.DECRYPT_MODE,privateKey);
encryptedtext = Base64.decode(encrypted_text.getBytes(),Base64.NO_WRAP);
encryptedtext = cipher.doFinal(encryptedtext);

String decryptpted_text = new String(encryptedtext);

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



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

解决方案

希望这个帮助你

  public void generateKeys(){
try {
SharedPreferences SP;
SharedPreferences.Editor SPE; KeyBairGenerator生成器

generator = KeyPairGenerator.getInstance(RSA,BC);
generator.initialize(256,新的SecureRandom());
KeyPair对= 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();
}
返回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();
}
返回null;
}
public String getPrivateKeyAsString(){
return SP.getString(PrivateKey,);
}


I am trying to use encrypt data using RSA. So far everything is fine. I can generate Private-Public keys, I can encrypt and Decrypt string successfully. Now i want stored Public key in SharedPreference. I can store it as string. I can retrieve it as string. I need to convert it to Key, to pass to cipher. Conversion from String to original format is not happening.

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 am facing issue in cipher.init(Cipher.ENCRYPT_MODE,publicKey); publicKey contains stored PublicKey, extracted from SahredPreferences. It is of type String! How to convert it to Key?

PS:This is just sample code, in real life situation i will be storing private key in server and Public key will be issued to users.

解决方案

Hope this help you

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

这篇关于将公钥存储在sharedPreferences中,并检索它的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆