通过PEM字符串在Java中创建DSA PublicKey



使用

创建了DSA键盘
ssh-keygen -t dsa

然后使用

将公共密钥部分转换为PEM格式
openssl dsa -in mytestkey -pubout
然后,我尝试使用以下内容来构建公共关键:
            private static final String PUBLIC_KEY_PEM =
            "-----BEGIN PUBLIC KEY-----n" +
                    "MIIBtzCCASsGByqGSM44BAEwggEeAoGBAJLJRIrDdiwbB6iWZTWowprJB8QfbLK7n" +
                    "8OUCoj6Ot5nfEL5VDPcc0v1rCGQxmL+nijPQsxA0LTucBySlkj6AvGIdND6yY7Qxn" +
                    "OZYeP6UErByzVhmDNG2MIhK7SL36O3uutOJKr86aTiDxP8/zSUO8JPZHqtr2K2Cmn" +
                    "lY6LQpocGnZ/AhUAmA/eq9AcGaNAqbT6ebB3IE3qWKkCgYAuh3zCz9aTPJ8+D9ton" +
                    "6xjjE6SEqKM4EDaA8kpV/363ad8kZRLRmtxTGDpIKV/k4ebb94+4o6VEFJKTUH7tn" +
                    "7c5uj8Hnr+8scctFE85nXprpK/CmxvWIZRl0AWjz1/8hoaUX3ZcLz9QbOLk1deSSn" +
                    "BksFgKZQgoaNVY3PPq0pjNfdCAOBhQACgYEAkDATEoqoCXMOy/LK+TOBqXWu3Texn" +
                    "kkBMTJxYHyhXqmBLvvkiwBX1wz0i58Zg0Qde4euHXrYwYzufBXeMZ9p3Wku7VIwDn" +
                    "4PfefBAZhzCJ+Dh937T/2dI/PqNIObZb28I7TXD/SQfwXurKDnGdl16LHmMcZ7bSn" +
                    "d6AFgUd73b+Obh8=n" +
                    "-----END PUBLIC KEY-----";
                    KeyFactory.getInstance("DSA").generatePublic(new X509EncodedKeySpec(PUBLIC_KEY_PEM.getBytes()));

但是我收到以下消息:

Exception in thread "main" java.security.spec.InvalidKeySpecException: Inappropriate key specification: invalid key format
at sun.security.provider.DSAKeyFactory.engineGeneratePublic(DSAKeyFactory.java:119)
at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
at com.dave.testing.RandomTesting.generatePublicKey2(RandomTesting.java:60)

为什么我的代码不正确?

您的密钥当前使用base64编码。为了使用X509EncodedKeySpec读取它,您需要将其解码。您可以使用任何基本64解码器,我现在使用了BouncyCastle提供的一个。为此,您需要从非BASE64零件(分别为-----BEGIN PUBLIC KEY----------END PUBLIC KEY-----行)剥离它。

以下代码段使用org.bouncycastle.util.encoders.Base64

final String PUBLIC_KEY_PEM = "MIIBtzCCASsGByqGSM44BAEwggEeAoGBAJLJRIrDdiwbB6iWZTWowprJB8QfbLK7n"
                                        + "8OUCoj6Ot5nfEL5VDPcc0v1rCGQxmL+nijPQsxA0LTucBySlkj6AvGIdND6yY7Qxn"
                                        + "OZYeP6UErByzVhmDNG2MIhK7SL36O3uutOJKr86aTiDxP8/zSUO8JPZHqtr2K2Cmn"
                                        + "lY6LQpocGnZ/AhUAmA/eq9AcGaNAqbT6ebB3IE3qWKkCgYAuh3zCz9aTPJ8+D9ton"
                                        + "6xjjE6SEqKM4EDaA8kpV/363ad8kZRLRmtxTGDpIKV/k4ebb94+4o6VEFJKTUH7tn"
                                        + "7c5uj8Hnr+8scctFE85nXprpK/CmxvWIZRl0AWjz1/8hoaUX3ZcLz9QbOLk1deSSn"
                                        + "BksFgKZQgoaNVY3PPq0pjNfdCAOBhQACgYEAkDATEoqoCXMOy/LK+TOBqXWu3Texn"
                                        + "kkBMTJxYHyhXqmBLvvkiwBX1wz0i58Zg0Qde4euHXrYwYzufBXeMZ9p3Wku7VIwDn"
                                        + "4PfefBAZhzCJ+Dh937T/2dI/PqNIObZb28I7TXD/SQfwXurKDnGdl16LHmMcZ7bSn"
                                        + "d6AFgUd73b+Obh8=n";
KeyFactory.getInstance("DSA").generatePublic(new X509EncodedKeySpec(Base64.decode(PUBLIC_KEY_PEM)));

尝试此

public static DSAPublicKey getPublicKeyFromString(String key) throws IOException, GeneralSecurityException {
        String publicKeyPEM = key;
        publicKeyPEM = publicKeyPEM.replace("-----BEGIN PUBLIC KEY-----n", "");
        publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");
        byte[] encoded = Base64.decodeBase64(publicKeyPEM);
        KeyFactory kf = KeyFactory.getInstance("DSA");
        DSAPublicKey pubKey = (DSAPublicKey) kf.generatePublic(new X509EncodedKeySpec(encoded));
        return pubKey;
    }

@ben已经回答了上述;)

最新更新