Not implemented yet: DSA public key

2019-09-17 03:27发布

我正在写既是服务器也是一个Android客户端应用程序。 Android客户端发送测量到服务器。 为了保证数据的完整性,数字签名被附加到每个测量。

因为我需要的一切是GSON兼容,存储在公共密钥本身是不可能的。 我存储的G,P,Q和Y因素来代替。

下面是来自请求类的一个片段:

    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)

Nextly指向规则A.

我绝对不知道我做错了什么和这些消息的意思。 我该如何解决这些? 任何人谁可以告诉我,我做错了什么?

非常感谢。

Answer 1:

你应该能够存储的Base64编码从公共密钥,仍然可以得到有效的JSON。 您应该能够使用DSAPublicKeySpec直接不调用getKeySpec()这显然不是在充气城堡(Android的JCE提供者)来实现。 不知道为什么你在服务器上获得NPE,也许错了格式。 BTW,它可能会更容易,如果你正在处理一个单一的供应商,所以你可能想在服务器上使用充气城堡为好。



文章来源: Not implemented yet: DSA public key