【问题标题】:Write public/private key to the SharedPreferences and use it将公钥/私钥写入 SharedPreferences 并使用它
【发布时间】:2013-07-22 15:30:47
【问题描述】:

我正在尝试使用公钥/私钥加密和解密文本。首先,我创建我的密钥并将它们存储在 sharedpreferences 中,并使用以下代码:

SharedPreferences SP;

SharedPreferences.Editor SPE;

KeyPairGenerator keyGen;

KeyPair keypair;

PublicKey publicKey;

PrivateKey privateKey;

keyGen = KeyPairGenerator.getInstance("RSA"); 

keyGen.initialize(1024);        

keypair = keyGen.genKeyPair();

privateKey = keypair.getPrivate(); 

publicKey = keypair.getPublic();

SPE = SP.edit();

SPE.putString("PublicKey", publicKey.toString());

SPE.putString("PrivateKey", privateKey.toString());

SPE.commit();

在我的 SharedPreferences 文件中,键是这样写的:

PublicKey:RSA 公钥

modulus: d07b8f32968cf65301fd710f9d6d036feac01d7b98c92ff979cd324d252cb257ff48d6630b33f0f68bd0ee81c3a83502a0abf0b263dc96c2b86940f7ec19ab1865626383e55cf5a37e25ef4eb6ca88a39f31becb6065434bc2236177aa5b35266fe0379164faea6ef7a92812e7aa3ef5fc488c70ab085f5564f09c0f6e927b49

公共指数:10001

PrivateKey:RSA 私有 CRT 密钥

modulus: d07b8f32968cf65301fd710f9d6d036feac01d7b98c92ff979cd324d252cb257ff48d6630b33f0f68bd0ee81c3a83502a0abf0b263dc96c2b86940f7ec19ab1865626383e55cf5a37e25ef4eb6ca88a39f31becb6065434bc2236177aa5b35266fe0379164faea6ef7a92812e7aa3ef5fc488c70ab085f5564f09c0f6e927b49

公共指数:10001
private exponent: 67ebef696c1a3fff0892e8f4bba8477a562e05844298a6cd58a5ac59401a939bc1a8f114d5d4c25c633d766640bd6c0f2f4005ef265022e6553e4220531448702e4bbf4322b9d5cf444d16eea151e5d565412b49208a73d9236607475d201affa21d374e3186f14b651b08565be4725f89fc6797a79c8433c4dd089589284a01

primeP:ee4ad1a56f4ee3b12c198d09b08a92c349f94cc79a6143ca7140fa64c919f2d9c24c29d3b413fdc4039000b6b5feac5a764ce436db4a4a382d8ceecbc768e0d1

primeQ:dff9a761807440b4a5a4fb04ebaa22849f6543f33168bd6e83b3c549b346661124d7879e168c1009e97c01b3fdcd7088eebd9c989b64d7c4b81ea46f9e06d

primeExponentP: 2ce01e371f8d25c819dbfdf9932ba593ed7c6b7f338d99aca8436a644c92fc6f11ee31fa5271695adea8e1d986d09d38b40aaaf7c1b86dddc28645fa4e656be1

primeExponentQ: 21904af9fc82ef5362e3474ea4763978005eef80d92da5fd92b4f4e2a77fec39b378acf50ed1ec715fd0da7c7b9336c2fe6be1b4a8ccc2dcd2ee9c9bb165ba19

crtCoefficient: d8ccccb874ec4c2d464e84829547507e1ebf78e506caa77950b04329957b8713e80553874b825bf5c90b214984b4657b64965867460d87aab135f43930p>48c

我正在尝试使用此代码读取此键:

private PublicKey getPublicKey() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeySpecException{

    byte[] keyBytes = Base64.decodeBase64(SP.getString("PublicKey", "default value").getBytes("utf-8"));
    X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PublicKey key = keyFactory.generatePublic(spec);
    return key;}

但是出了点问题。它给出了 InvalidKeySpecException。我觉得这无法从文件中读取密钥。我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: android sharedpreferences private-key public-key


    【解决方案1】:

    好的。我找到了一些解决方案并改变了一些东西。这是用于公钥/私钥存储并从存储的字符串中再次获取它的新类。这门课适合我!

    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.SecureRandom;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.X509EncodedKeySpec;
    import org.bouncycastle.util.encoders.Base64;
    import android.app.Activity;
    import android.content.Context;
    import android.content.SharedPreferences;
    
    public class KeyGenerator extends Activity{
    
        SharedPreferences SP;
        SharedPreferences.Editor SPE;
        PublicKey pubKey;
        PrivateKey privKey; 
        Context context;
    
        public KeyGenerator(Context context){
            this.context = context;
            SP = context.getSharedPreferences("KeyPair", MODE_PRIVATE);
        }
    
        public void generateKeys(){
            try {
                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】:

      感谢您接受上面的代码(可能在下面)。但是,就我而言,“getPrivatekey()”会引发 InvalidKeySpecException。它说“未知 KeySpc 类型:java.secrity.spec.X509EncodedKeySpec”。我使用的解决方案是将 X509EncodedKeySpec 替换为 PKCS8EncodedKeySpec。然后它起作用了! 参考:https://stackoverflow.com/a/9755391/2481444

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多