【问题标题】:Storing public key in sharedPreferences, and Retrieving it将公钥存储在 sharedPreferences 中并检索它
【发布时间】:2015-11-06 07:22:08
【问题描述】:

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

这是我尝试过的

        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 包含存储的 PublicKey,从 SahredPreferences 中提取。它是字符串类型!怎么转成Key?

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

【问题讨论】:

    标签: java android encryption sharedpreferences


    【解决方案1】:

    希望对你有帮助

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

    【讨论】:

    • 这是非常短的代码,如果您想了解更多关于共享偏好的信息,请点击此链接androidbeginersamit.blogspot.in/2014/08/…
    • 谢谢,但这不是我想要的。我可以存储和检索字符串。如何存储和检索公钥
    • @DARSH 如果您需要公开存储,那么您无需保存在共享偏好中,您可以保存在全局变量中,然后您可以使用 public static String 从任何地方访问该变量。 ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多