【问题标题】:Not implemented yet: DSA public key尚未实现:DSA 公钥
【发布时间】:2012-05-18 13:56:19
【问题描述】:

我正在编写服务器和 Android 客户端应用程序。 Android 客户端将测量值发送到服务器。为了确保数据的完整性,每次测量都会附加一个数字签名。

因为我需要所有东西都与 Gson 兼容,所以存储公钥本身是不可能的。我正在存储 G、P、Q 和 Y 因子。

这是请求类中的一个 sn-p:

    public PublicKey getPublicKey() {
    try {
        DSAPublicKeySpec keySpec = new DSAPublicKeySpec(publicKeyY, publicKeyP,
                                                        publicKeyQ, publicKeyG);
        KeyFactory fact = KeyFactory.getInstance("DSA");
        PublicKey pubKey = fact.generatePublic(keySpec); // A
        return pubKey;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public void setPublicKey(PublicKey publicKey) {
    try {
        KeyFactory fact = KeyFactory.getInstance("DSA");
        DSAPublicKeySpec pub = fact.getKeySpec(publicKey, DSAPublicKeySpec.class); // B
        publicKeyG = pub.getG();
        publicKeyP = pub.getP();
        publicKeyQ = pub.getQ();
        publicKeyY = pub.getY();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

构造函数使用 setPublicKey 方法。当我在客户端创建这样的请求并将其发送到服务器时,都会导致异常。

在客户端:

 java.lang.RuntimeException: not implemented yet DSA Public Key
             y: 2f9286201b266f38d682e99814612f7d37c575d3a210de114bdf02092f4a835109f28a590cfc568bb6525d59b8275fe791f3ddf20e85df44fd2e8622289f6dbc27c73d31d1769feae19573df22a9ca8ef80a9f7230b0b4a2671cc03fdb2788b55b4e9a68a7a5a93a214cc5aa39ccb5155a13354870d45a38760a80fd34333073
  class java.security.spec.DSAPublicKeySpec
    at org.bouncycastle.jce.provider.JDKKeyFactory.engineGetKeySpec(JDKKeyFactory.java:148)
    at java.security.KeyFactory.getKeySpec(KeyFactory.java:210)

堆栈跟踪中的下一件事指向我标记为 B 的规则

在服务器上:

java.lang.NullPointerException
    at sun.security.provider.DSAPublicKey.<init>(DSAPublicKey.java:74)
    at sun.security.provider.DSAPublicKeyImpl.<init>(DSAPublicKeyImpl.java:46)
    at sun.security.provider.DSAKeyFactory.engineGeneratePublic(DSAKeyFactory.java:86)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:304)
    at sensserve.protocol.StartSessionRequest.getPublicKey(StartSessionRequest.java:66)

接下来指向规则 A。

我完全不知道我做错了什么以及这些消息意味着什么。我该如何解决这些?谁能告诉我我做错了什么?

非常感谢。

【问题讨论】:

    标签: android security jakarta-ee digital-signature dsa


    【解决方案1】:

    您应该能够以 Base64 编码的方式存储公钥,并且仍然可以获得有效的 JSON。您应该能够直接使用DSAPublicKeySpec 而无需调用getKeySpec(),这显然没有在Bouncy Castle(Android 的JCE 提供程序)中实现。不知道为什么你在服务器上得到 NPE,可能是错误的格式。顺便说一句,如果您与单个提供商打交道可能会更容易,因此您可能也希望在服务器上使用 Bouncy Castle。

    【讨论】:

    • 感谢您的评论,它帮助我交换了公钥。但是,验证仍然不起作用。我想你的最后一句话可能与它有关。我为此做了一个单独的主题:stackoverflow.com/questions/10601507/…你介意看看吗?
    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 2010-12-27
    • 2013-05-07
    • 2017-05-16
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多