【问题标题】:loading a DSA public key in Java在 Java 中加载 DSA 公钥
【发布时间】:2017-05-16 04:04:44
【问题描述】:

假设我有一个如下所示的 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

有什么想法吗?

【问题讨论】:

    标签: java bouncycastle dsa


    【解决方案1】:

    充气城堡库包括一个 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+XCXuNp5zhAzKdhrRguI\n" +
                "uI5kLia8fhRb+1EnFPNpXt4fUS2c/0P0nvzH/TvApizzMkRYJea6rRSW5B+MDjv6\n" +
                "lvrxv+5xBM15kdug033mgSL7wEJIrTLwbe5/djz2oe+pr1KLqs/fvgyKcQyttUWb\n" +
                "5SmwZ+UVx3zfAhUAu0kA2L6VgbvEwpD9sTj5tLyB6Y0CgYEA5GjC+KsPsAH3HZKl\n" +
                "2IwTjX47iNVHyuzr4ZcyXceJ/pi3WR6bQJ6tpf1I2jIE0DOMPlNUwYh0aWBGvoY2\n" +
                "t4d5cwZaW90OS8IAIRFkQS0ywpmJyb7KXqRHwAYdMID88GW0d/KsVB3if0j/9QOo\n" +
                "jhGOrO+kJcZBxUSxINgIIEYFAlEDgYUAAoGBALnHTAZlpoLJZuSBVtnMuRM3cSX4\n" +
                "3IkE9w9FveDV1jX5mmfK7yBVpQFV8eVJfk91ERQ4Dn6ePLUv2dRIt4a0S0qHqadg\n" +
                "zyoFyqkmmUi1kNLyixtRqh+m2gXx0t63HEpZDbEPppdpnlppZquVQh7TyrKSXW9M\n" +
                "TzUkQjFI9UY7kZeK\n" +
                "-----END PUBLIC KEY-----";
    
            Security.addProvider(new BouncyCastleProvider());
            PEMReader reader = new PEMReader(new StringReader(key));
            DSAPublicKey decoded = (DSAPublicKey) reader.readObject();
            System.out.println(decoded.getClass());
        }
    }
    

    【讨论】:

    • -----BEGIN PUBLIC KEY----------END PUBLIC KEY----- 分隔符是 PEM 格式的一部分,base 64 编码也是如此。只需向读者提供 openssl 的 PEM 输出。我已经用一个完整的例子更新了答案。
    猜你喜欢
    • 2010-12-27
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2012-05-18
    • 2019-03-29
    • 2011-11-24
    • 2014-11-29
    相关资源
    最近更新 更多