当前位置: 首页 > 知识库问答 >
问题:

在sharedPreferences中存储公钥并检索它

空佐
2023-03-14

我正在尝试使用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包含从SAHREDPREFERENCES中提取的存储的它的类型是String!如何将其转换为密钥?

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

共有1个答案

别烨熠
2023-03-14

希望这对你有帮助

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", "");      
    }
 类似资料:
  • 我正在使用这段代码,但当我从首选项获得位置时,位置返回如下所示... 位置[mprovider=存储,Mtime=0,mlatitude=30.0,montilunde=76.0,mhasaltitude=false,maltitude=0.0,mhasspeed=false,mspeed=0.0,mhasbearing=false,mbearing=0.0,mhasaccuracy=false,

  • 我们需要使用Azure key vault创建RSA密钥对,并将RSA公钥复制到外部系统。其要求是外部系统使用公钥加密数据,内部系统与azure key vault对话并对数据进行解密。我还没有访问Azure key vault的权限,所以需要查看文档。我有两个基本问题: > 有没有一种方法可以使用Azure portal以文本格式导出RSA公钥,而不使用API(https://docs.micr

  • 我创建了一个密钥库,它包括私钥和公钥。我需要使用java代码检索我的公钥和私钥。我在这里找到了一个检索私钥的方法。但我找不到检索公钥的方法。有人能告诉我一种取出公钥的方法吗

  • 有没有人可以粘贴一些用于存储私钥和公钥的示例代码。 非常感谢!

  • 我正在做一个项目,我想要一个功能,在WhatsApp上给我们留言,为此,我使用了使用intent的WhatsApp API。在“WhatsApp上向我们发送消息”功能中,我使用了2-3个不同的数字,并将其存储在列表中,并使用random()方法从列表中检索该数字,正如我所希望的那样,每当用户使用该功能时,他/她每次都必须连接不同的数字。但现在我想更改列表中存储的数字。 那么,我如何在每次不改变实际

  • 在SSO的实现中,我使用了bouncycastle(JAVA)进行签名、加密、解密和签名的验证。我有原始PGP公钥和私钥,我需要将它们存储在Java Keystore中。这些PGP公钥没有证书。 我知道对于公钥(根据Keystore的javadoc:http://docs.oracle.com/javase/6/docs/api/java/security/keystore.html),我必须创建