如何将 android PublicKey 转换为字符串并返回?

How can convert android PublicKey to string and back?

我正在尝试创建一个可以加密用户消息的应用程序。用户 Public 密钥需要作为字符串发布到服务器。我正在生成 Android KyeStore Public密钥,如下所示:

    public static PublicKey getOrCreatePublicKey(String alias) throws GeneralSecurityException, IOException {

    KeyStore keyStore = KeyStore.getInstance(ANDROID_PROVIDER);
    keyStore.load(null);
    if (!keyStore.containsAlias(alias) || keyStore.getCertificate(alias) == null) {

        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
                alias,
                KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                .setDigests(KeyProperties.DIGEST_SHA256,
                        KeyProperties.DIGEST_SHA512)
                .build();
        KeyPairGenerator generator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, ANDROID_PROVIDER);
        generator.initialize(spec);
        generator.generateKeyPair();
    }
    return keyStore.getCertificate(alias).getPublicKey();
}

然后我尝试将 PublicKey 转换为字符串并返回 PublicKey,如下所示:

public static PublicKey stringToPublicKey(String publStr)  {

    PublicKey publicKey = null;
    try {
        byte[] data = Base64.decode(publStr, Base64.DEFAULT);
        X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
        KeyFactory fact = KeyFactory.getInstance("RSA");
        publicKey = fact.generatePublic(spec);
    } catch (GeneralSecurityException e) {
        e.printStackTrace();
    }
    return publicKey;
}


public static String publicKeyToString(PublicKey publ) {
    String publicKeyString = null;
    try {
        KeyFactory fact = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec spec = fact.getKeySpec(publ,
                X509EncodedKeySpec.class);
        publicKeyString = Base64.encodeToString(spec.getEncoded(), Base64.DEFAULT);
    } catch (GeneralSecurityException e) {
        e.printStackTrace();
    }
    return publicKeyString;
}

然后我尝试使用 Public 和私钥加密和解密用户消息。

如果我不转换 Public 密钥,加密工作正常。但是,如果我将 Public Key 转换为字符串并返回 Public Key,加密将不再有效。 我究竟做错了什么?谢谢。

   PublicKey publicKey1 = getOrCreatePublicKey("alias");
        String publicKeyStr = publicKeyToString(publicKey1);
        PublicKey publicKey2 = stringToPublicKey(publicKeyStr);

    //this one works            
        String message = encrypt(str, publicKey1);
        String decryptm = decrypt(message, privateKey);

    //this one doesn't work
    String message = encrypt(str, publicKey2);
        String decryptm = decrypt(message, privateKey);

我已经替换了

KeyProperties.ENCRYPTION_PADDING_RSA_OAEPKeyProperties.ENCRYPTION_PADDING_RSA_PKCS1.

我也换了

密码密码=Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");

密码密码=Cipher.getInstance("RSA/ECB/PKCS1Padding");

现在可以了。但是我还是不知道为什么第一次不行。

您的 publicKeyToString 函数运行很长。它不应该是在 "reverse" 中再次完成 stringToPublicKey 的所有步骤。我的意思是,您不必构造对象,您已经将 public 键作为对象。获取PublicKey转String基本上只需要一行

public static String publicKeyToString(PublicKey publ) {
    String publicKeyString = Base64.encodeToString(publ.getEncoded(), 2);
    return publicKeyString;
}

这应该输出一个与您的 stringToPublicKey 函数一起使用的字符串(我认为它是正确的)。