RSA加密解密Android

时间:2016-05-10 12:36:38

标签: android sharedpreferences rsa

我有一个设置屏幕,我希望用户填写个人详细信息。 我想让他们保持共享的态度。 我想在保存在Sharedpreferences之前加密数据。 只有在使用它时,它才会在另一个应用程序活动中解密共享偏好中存在的内容并使用它。 为此,我在设置屏幕中加密了信息,并将加密后的字符串保存到sharedpreferences中。 为了Decrypt我需要相同的privateKey,我不知道如何将它移动到其他活动。我尝试使用共享偏好但程序正在飞行。

非常感谢帮助

代码:

    $counter = $this->helper('\Magento\Checkout\Helper\Cart'); 
    echo $counter->getItemsCount();

加密功能:

 try{
     SharedPreferences.Editor editor =getActivity().getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
     afterEncryptCvv = Encrypt((String) newValue,editor);
     editor.putString("cvvValue", afterEncryptCvv);
     editor.commit(); 
    }
     catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
     } catch (NoSuchPaddingException e) {
            e.printStackTrace();
     } catch (InvalidKeyException e) {
            e.printStackTrace();
     } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
     } catch (BadPaddingException e) {
            e.printStackTrace();
     }

在第二项活动中:

   public static String Encrypt(String plain, SharedPreferences.Editor editor)        
   throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,    
   IllegalBlockSizeException, BadPaddingException
    {
        kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        kp = kpg.genKeyPair();
        publicKey = kp.getPublic();


        privateKey = kp.getPrivate();
        Gson gson4 = new Gson();
        String json4 = gson4.toJson(privateKey);
        editor.putString("privateKey", json4);

        cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        encryptedBytes = cipher.doFinal(plain.getBytes());
        encrypted = bytesToString(encryptedBytes);


        return encrypted;

    }

解密功能:

 SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);

    try {
        Gson gson4 = new Gson();
        String json4 = prefs.getString("privateKey", "");
        privateKey = gson4.fromJson(json4, PrivateKey.class);
        cvvValue = prefs.getString(Cvv, "");
        String temp = Decrypt(cvvValue);
        cvvValue =temp;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:2)

您不应将密钥存储在内部存储中。拥有root设备的人可以轻松提取它。

相反,在生成密钥对后,您可以将其保存在Android密钥库中(请参阅此处:http://developer.android.com/training/articles/keystore.html)并在需要时使用它。

例如:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(alias, null);