在Java加载DSA公钥



假设我有一个看起来像这样的DSA公钥:

-----BEGIN PUBLIC KEY-----
MIIBuDCCASwGByqGSM44BAEwggEfAoGBAOwYAcAzXpuw+XCXuNp5zhAzKdhrRguI
uI5kLia8fhRb+1EnFPNpXt4fUS2c/0P0nvzH/TvApizzMkRYJea6rRSW5B+MDjv6
lvrxv+5xBM15kdug033mgSL7wEJIrTLwbe5/djz2oe+pr1KLqs/fvgyKcQyttUWb
5SmwZ+UVx3zfAhUAu0kA2L6VgbvEwpD9sTj5tLyB6Y0CgYEA5GjC+KsPsAH3HZKl
2IwTjX47iNVHyuzr4ZcyXceJ/pi3WR6bQJ6tpf1I2jIE0DOMPlNUwYh0aWBGvoY2
t4d5cwZaW90OS8IAIRFkQS0ywpmJyb7KXqRHwAYdMID88GW0d/KsVB3if0j/9QOo
jhGOrO+kJcZBxUSxINgIIEYFAlEDgYUAAoGBALnHTAZlpoLJZuSBVtnMuRM3cSX4
3IkE9w9FveDV1jX5mmfK7yBVpQFV8eVJfk91ERQ4Dn6ePLUv2dRIt4a0S0qHqadg
zyoFyqkmmUi1kNLyixtRqh+m2gXx0t63HEpZDbEPppdpnlppZquVQh7TyrKSXW9M
TzUkQjFI9UY7kZeK
-----END PUBLIC KEY-----

我通过执行openssl dsa -in dsa_priv.pem -pubout -out dsa_pub.pem

生成了此键

我希望能够将此键加载到Java中,但我尚不清楚如何。

我要使用的RSA是...我base64将字符串解码为字节数组,然后将字节数组传递给org.bouncycastle.asn1.pkcs.RSAPrivateKey.getInstance()。那时,您可以将单个参数传递给java.security.spec.RSAPrivateKeySpec,然后用钥匙从那里进行操作。

但是我如何使用DSA做到这一点?正如我所能透露的,没有org.bouncycastle.asn1.pkcs.RSAPrivateKey类。这是我尝试导入的错误:

import org.bouncycastle.asn1.pkcs.DSAPublicKey;
                                 ^
  symbol:   class DSAPublicKey
  location: package org.bouncycastle.asn1.pkcs
1 error

有什么想法?

弹力城堡库包括一个PEM读取器,将您的钥匙解析为 java.security.interfaces.DSAPublicKey

PEMReader reader = new PEMReader(new FileReader("id_dsa.pub"));
DSAPublicKey publicKey = (DSAPublicKey) reader.readObject();
// What implementation are we dealing with?
System.out.println(publicKey.getClass());

实现类显然是org.bouncycastle.jce.provider.JDKDSAPublicKey

完整示例:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMReader;
import java.io.StringReader;
import java.security.Security;
import java.security.interfaces.DSAPublicKey;
public class DSA {
    public static void main(String[] args) throws Exception {
        String key =
            "-----BEGIN PUBLIC KEY-----n" +
            "MIIBuDCCASwGByqGSM44BAEwggEfAoGBAOwYAcAzXpuw+XCXuNp5zhAzKdhrRguIn" +
            "uI5kLia8fhRb+1EnFPNpXt4fUS2c/0P0nvzH/TvApizzMkRYJea6rRSW5B+MDjv6n" +
            "lvrxv+5xBM15kdug033mgSL7wEJIrTLwbe5/djz2oe+pr1KLqs/fvgyKcQyttUWbn" +
            "5SmwZ+UVx3zfAhUAu0kA2L6VgbvEwpD9sTj5tLyB6Y0CgYEA5GjC+KsPsAH3HZKln" +
            "2IwTjX47iNVHyuzr4ZcyXceJ/pi3WR6bQJ6tpf1I2jIE0DOMPlNUwYh0aWBGvoY2n" +
            "t4d5cwZaW90OS8IAIRFkQS0ywpmJyb7KXqRHwAYdMID88GW0d/KsVB3if0j/9QOon" +
            "jhGOrO+kJcZBxUSxINgIIEYFAlEDgYUAAoGBALnHTAZlpoLJZuSBVtnMuRM3cSX4n" +
            "3IkE9w9FveDV1jX5mmfK7yBVpQFV8eVJfk91ERQ4Dn6ePLUv2dRIt4a0S0qHqadgn" +
            "zyoFyqkmmUi1kNLyixtRqh+m2gXx0t63HEpZDbEPppdpnlppZquVQh7TyrKSXW9Mn" +
            "TzUkQjFI9UY7kZeKn" +
            "-----END PUBLIC KEY-----";
        Security.addProvider(new BouncyCastleProvider());
        PEMReader reader = new PEMReader(new StringReader(key));
        DSAPublicKey decoded = (DSAPublicKey) reader.readObject();
        System.out.println(decoded.getClass());
    }
}

最新更新