2012-07-24 3 views
1

방금 ​​만든 서명을 확인하는 데 문제가 있습니다. 서명을 한 후에는 먼저 Base64를 사용하여 서명을 텍스트로 변환하고 테스트로서 Base64를 디코딩하고 서명을 검증 할 수 있는지 확인하고자했습니다. 이것은 실패합니다. 다음은 오류 처리 기능이없는 코드입니다.Android : DSA 서명 - 서명 및 확인

DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate(); 
DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic(); 

가 지금은 출력을 기록하는 텍스트 및 인쇄에 서명 - 괜찮을 것 같다 :

내 키 쌍이

String text = "test"; 
Signature signer = null; 
signer = Signature.getInstance(privateKey.getAlgorithm()); 
SignedObject signedObject = null; 
signedObject = new SignedObject(text, privateKey, signer); 
String print_signature = Base64.encodeToString(signedObject.getSignature(), Base64.DEFAULT); 
System.out.println("Base64 Signature: " + print_signature); 

지금은 위에서 만든 SignedObject를 개체를 사용하여 서명을 확인하고 Base64가 아닙니다. 이것은 성공 : 만이 매개 변수를 사용하여 서명을 확인해야하므로 AFAIK SignedObject를 개체를 사용할 수 없도록

Signature verifier = null; 
verifier = Signature.getInstance(publicKey.getAlgorithm()); 
boolean b = signedObject.verify(publicKey, verifier)); 

내 앱 난 단지 서명자의 공개 인증서와 Base64로 인코딩 된 문자열이있을 것이다.

Signature verifier1 = null; 
verifier1 = Signature.getInstance(publicKey.getAlgorithm()); 
verifier1.initVerify(publicKey); 
verifier1.update(text.getBytes()); // sorry I forgot this in original posting 
byte[] sig1 = Base64.decode(print_signature, Base64.DEFAULT); 
b = verifier1.verify(sig1)); 

이 확인은 항상 실패합니다 (b = false).

+0

Base64 디코드 이후의 서명 sig1 (바이트 배열)이있는 Base64 인코더 이전의 signedObject.getSignature()에서 반환 된 서명 (바이트 배열)을 확인하는 테스트를 추가했습니다. 일치해라. Base64 잘 작동하는 것, 그래서 내 verifier1 개체 (IMHO) 문제가 있어야합니다. – LJB

답변

0

왜 처음에는 SignedObject을 사용하고 있습니까? 그것은 무엇을 사나요? 확인 실패와 관련하여 송수신 후 동일한 바이트를 가져야합니다. 동일한 인코딩으로 송수신 하시겠습니까? 누군가가 문자열을 수정하고 있습니까?

+0

음 SignedObject 개체를 사용하여 데이터에 서명했습니다. 데이터가있는이 서명은 다른 PC로 전송되는 것으로 가정되지만 전송 전에 서명을 먼저 확인하기로 결정했습니다. 그래서 SignedObject와 Base64 형식을 사용하여 궁극적으로 그것을 전송할 것인가를 확인합니다. 귀하의 질문에 대한 : 나는 아직 아무것도 전송하지 않았습니다. 전송할 기능 내에서 여전히 테스트합니다. 인코딩은 UTF-8로 확인되었습니다. 문자열은 여전히 ​​동일한 함수이므로 문자열을 수정 한 사람이 없습니다. – LJB

+0

SignedObject를 사용하는 이유에 대해 궁금한 생각이 들게되었습니다. 나는 레거시 코드 때문에 그것을 가지고있다. 나는 이것을 제거하고 Signature 클래스를 사용하도록 변경했으며 이제 검증 작업을 수행합니다 !!! 아직도 이유를 이해하지 못한다. 그러나 적어도 나는 계속할 수있다. - thx – LJB