Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将公钥转换为字符串_Android_Keystore_Public Key Encryption_Android Keystore - Fatal编程技术网

Android 将公钥转换为字符串

Android 将公钥转换为字符串,android,keystore,public-key-encryption,android-keystore,Android,Keystore,Public Key Encryption,Android Keystore,在我的开发步骤中,我需要使用一个API,该API要求我向其发送RSA公钥,例如: -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAsFxynduUThmOU9j7Qg7C/XOKVccJ26AlL/SdEDA1YcFLfG4XcmLm 2rYAq4ia52tIJRuaiDGxaG3EKB38J35ycUe0pB48x+y+rMLDtn/p3PxyfOmkZ+VT vKN025eNG9MisO+r6dQY8UaODtvRBzov2oB7+sQUD0i2zn7F

在我的开发步骤中,我需要使用一个API,该API要求我向其发送RSA公钥,例如:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAsFxynduUThmOU9j7Qg7C/XOKVccJ26AlL/SdEDA1YcFLfG4XcmLm
2rYAq4ia52tIJRuaiDGxaG3EKB38J35ycUe0pB48x+y+rMLDtn/p3PxyfOmkZ+VT
vKN025eNG9MisO+r6dQY8UaODtvRBzov2oB7+sQUD0i2zn7F5BmO86wFxibSk4OG
ssgNyrg6G/H7X/AssgWWtUDV+r4hHRu1aDYJHoNeYTF/nMZl3g9cxuASBOfDemNS
iZPCqiGKuZ3X3tdUBkz/XlkeC+X/tJT9TBEnY2SS4FllHQcMhYaTiKf1ScG3JLbd
ekJCK2fnzXAp/3+Wp0GZD12de/7XLaPMhwIDAQAB
-----END RSA PUBLIC KEY-----
为此,我使用Android的密钥库API,我这样做:

KeyStore keyStore = KeyStore.getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
        keyStore.load(null);

        String alias = SecurityConstants.KEYSTORE_KEY_ALIAS;

        // Create the keys if necessary
        if (!keyStore.containsAlias(alias)) {

            Calendar notBefore = Calendar.getInstance();
            Calendar notAfter = Calendar.getInstance();
            notAfter.add(Calendar.YEAR, 1);
            KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
                    .setAlias(alias)
                    .setKeyType(KeyProperties.KEY_ALGORITHM_RSA)
                    .setKeySize(2048)
                    .setSubject(new X500Principal("CN=test"))
                    .setSerialNumber(BigInteger.ONE)
                    .setStartDate(notBefore.getTime())
                    .setEndDate(notAfter.getTime())
                    .build();
            KeyPairGenerator generator = KeyPairGenerator.getInstance(SecurityConstants.TYPE_RSA, SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
            generator.initialize(spec);

            KeyPair keyPair = generator.generateKeyPair();
        }
现在的问题是,我必须以字符串的形式获取公钥,我不确定正确的方法是什么,但我是这样做的:

public static PublicKey getPublicKey() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException, UnrecoverableEntryException {
    KeyStore keyStore = KeyStore.getInstance(SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);
    keyStore.load(null);
    KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(SecurityConstants.KEYSTORE_KEY_ALIAS, null);
    return privateKeyEntry.getCertificate().getPublicKey();
}

public static String getPublicKeyAsString() {
    try {
        return "-----BEGIN RSA PUBLIC KEY-----\n" + Base64.encodeToString(getPublicKey().getEncoded(), Base64.DEFAULT) +
                "-----END RSA PUBLIC KEY-----";
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (UnrecoverableEntryException e) {
        e.printStackTrace();
    }
    return null;
}

我设法得到了一个字符串,但我不确定这是否是正确的方法,可能不是它应该存储在密钥库中的完全相同的密钥,我没有看到谷歌支持这样做。有人有过这样的经历吗?

尝试用最后一个字符串加密某些内容,然后尝试用私钥解密。如果它能工作,应该没问题,不是吗?这听起来像是一种方法。我将尝试:)尝试将其存储在您的共享首选项中,还有加密的共享首选项可用