2012-05-10 3 views
0

서버와 Android 클라이언트 애플리케이션을 모두 작성하고 있습니다. 안드로이드 클라이언트는 서버에 측정 값을 보냅니다. 데이터 무결성을 보장하기 위해 디지털 서명이 각 측정에 추가됩니다.아직 구현되지 않았습니다. DSA 공개 키

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) 
I는 서버에서 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를 가리키는

내가 잘못한 점과 이러한 메시지의 의미에 대해서는 단서가 없습니다. 어떻게 해결할 수 있습니까? 내가 뭘 잘못하고 있는지 말해 줄 수있는 사람?

고마워요.

답변

0

인코딩 된 Base64로 공개 키를 저장하고 유효한 JSON을 가져올 수 있어야합니다. Bouncy Castle (안드로이드의 JCE 공급자)에서는 분명히 구현되지 않은 getKeySpec()을 호출하지 않고 DSAPublicKeySpec을 직접 사용할 수 있어야합니다. 서버에서 NPE를 얻는 이유가 확실하지 않습니다. 잘못된 형식 일 수 있습니다. BTW, 당신이 단일 공급자를 다루는 경우라면 아마 더 쉬울 것입니다. 그래서 Bouncy Castle을 서버에서도 사용할 수 있습니다.

+0

의견을 보내 주셔서 감사합니다. 공개 키를 교환하는 데 도움이되었습니다. 그러나 검증은 여전히 ​​작동하지 않습니다. 나는 네 마지막 문장이 그 일과 관련이 있다고 생각해. 나는 그것에 대해 별도의 주제를 만들었 : http://stackoverflow.com/questions/10601507/bouncycastle-on-the-server-side-with-android-phones-as-clients 당신도 잘보시겠습니까? – gleerman

관련 문제