Android 将公钥转换为字符串
在我的开发步骤中,我需要使用一个API,该API要求我向其发送RSA公钥,例如: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
-----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;
}
我设法得到了一个字符串,但我不确定这是否是正确的方法,可能不是它应该存储在密钥库中的完全相同的密钥,我没有看到谷歌支持这样做。有人有过这样的经历吗?尝试用最后一个字符串加密某些内容,然后尝试用私钥解密。如果它能工作,应该没问题,不是吗?这听起来像是一种方法。我将尝试:)尝试将其存储在您的共享首选项中,还有加密的共享首选项可用