微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将字符串转换为 PrivateKey 不会在 android 中提供相同的密钥

如何解决将字符串转换为 PrivateKey 不会在 android 中提供相同的密钥

我正在使用以下函数将 PrivateKey 转换为 String,反之亦然:

  private static String privateKeyToString(PrivateKey privateKey)
    {
        byte[] privateKeyByte = privateKey.getEncoded();
        String privateKeyString = Base64.encodetoString(privateKeyByte,Base64.NO_WRAP);
        return privateKeyString;
    }

    private static PrivateKey stringToPrivateKey(String privateKeyString)
    {
        byte[] privateKeyByteServer = Base64.decode(privateKeyString,Base64.NO_WRAP);
        // generate the publicKey
        KeyFactory keyFactory = null;
        try {
            keyFactory = KeyFactory.getInstance("RSA");
        } catch (NoSuchAlgorithmException e) {
            e.printstacktrace();
        }
        PrivateKey privateKeyServer = null;
        try {
            privateKeyServer = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyByteServer));
        } catch (InvalidKeySpecException e) {
            e.printstacktrace();
        }
        return privateKeyServer;

    } //To generate RSA Keys
 private static Map<String,Object> getRSAKeys() throws Exception {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();

        Map<String,Object> keys = new HashMap<String,Object>();
        keys.put("private",privateKey);
        keys.put("public",publicKey);
        return keys;
    }

现在用 stringToPrivateKey() 生成的密钥是“OpenSSlrsAPrivateKey”,而原始私钥是“OpenSSlrsAPrivateCRTKey”,这些不是相同的密钥。转换后如何获得相同的密钥?

原始密钥:

OpenSSlrsAPrivateCrtKey{modulus=c44f17124a2dc42553d78ba59664480fdabfbb38f9ade78ffbff23c681f9483c160c9336f466d5f19960ec1449c3f9aea557913b179218db941f60e60ce77b0b15e5a74d8e5eeb23df5081ffdff6f40c69488b8230ecd3fae17f680e9b6a194697a03671ac886d32dc68aafb77a269a167d3ae339d24cdfb5d0a17d9bbbcd037a5b30148d7a1d1281139020b1158df4b343c3ebb2b31ba1c93151801bbfc6e7ad552c18b12e7c868a44689b4a8af5ecea07fa0dfb1a65385647b21fa6383bb8b927044565dfac3154bfc8c7e51c9032d8dab211ba41de78f4061f8683f7bc649646c55dbb14c2ac2c681d6ff72b15b08eea5d46d6c515a208c7e44794dd67f67,publicExponent=10001}

转换后的密钥

OpenSSlrsAPrivateKey{modulus=c44f17124a2dc42553d78ba59664480fdabfbb38f9ade78ffbff23c681f9483c160c9336f466d5f19960ec1449c3f9aea557913b179218db941f60e60ce77b0b15e5a74d8e5eeb23df5081ffdff6f40c69488b8230ecd3fae17f680e9b6a194697a03671ac886d32dc68aafb77a269a167d3ae339d24cdfb5d0a17d9bbbcd037a5b30148d7a1d1281139020b1158df4b343c3ebb2b31ba1c93151801bbfc6e7ad552c18b12e7c868a44689b4a8af5ecea07fa0dfb1a65385647b21fa6383bb8b927044565dfac3154bfc8c7e51c9032d8dab211ba41de78f4061f8683f7bc649646c55dbb14c2ac2c681d6ff72b15b08eea5d46d6c515a208c7e44794dd67f67

解决方法

使用该方法获取String

public String getPrivateKey(String option)
        throws NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException,IllegalBlockSizeException,BadPaddingException {

    switch (option) {

        case "pkcs1-pem":
            String pkcs1pem = "-----BEGIN RSA PUBLIC KEY-----\n";
            pkcs1pem += Base64.encodeToString(publicKey.getEncoded(),Base64.DEFAULT);
            pkcs1pem += "-----END RSA PUBLIC KEY-----";

            return pkcs1pem;

        case "pkcs8-pem":
            String pkcs8pem = "-----BEGIN PUBLIC KEY-----\n";
            pkcs8pem += Base64.encodeToString(publicKey.getEncoded(),Base64.DEFAULT);
            pkcs8pem += "-----END PUBLIC KEY-----";

            return pkcs8pem;

        case "base64":
            return Base64.encodeToString(privateKey.getEncoded(),Base64.DEFAULT);

        default:
            return null;

    }

}

并使用此方法获取私钥

public static PrivateKey stringToPrivate(String private_key)
        throws NoSuchAlgorithmException,BadPaddingException {

    try {
        // Read in the key into a String
        StringBuilder pkcs8Lines = new StringBuilder();
        BufferedReader rdr = new BufferedReader(new StringReader(private_key));
        String line;
        while ((line = rdr.readLine()) != null) {
            pkcs8Lines.append(line);
        }

        // Remove the "BEGIN" and "END" lines,as well as any whitespace

        String pkcs8Pem = pkcs8Lines.toString();
        pkcs8Pem = pkcs8Pem.replace("-----BEGIN PRIVATE KEY-----","");
        pkcs8Pem = pkcs8Pem.replace("-----END PRIVATE KEY-----","");
        pkcs8Pem = pkcs8Pem.replaceAll("\\s+","");

        // Base64 decode the result

        byte[] pkcs8EncodedBytes = Base64.decode(pkcs8Pem,Base64.DEFAULT);

        // extract the private key

        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pkcs8EncodedBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PrivateKey privKey = kf.generatePrivate(keySpec);
        return privKey;

    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        e.printStackTrace();

        return null;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;


}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?