2016-06-20 3 views
1

파일에 데이터를 쓰고 있습니다. (이 경우 문자열이지만, 바이트를 사용하고 있기 때문에 아무 것도 될 수 있습니다.) 결과를 비교하는 것. 두 바이트 []를 비교하면 똑같아 보이지만, .equals()을 실행하면 false가 반환됩니다.문자열을 파일에 쓰고 파일을 읽은 후 변경했습니다.

아래에있는 내 코드를 찾아주세요 : 나는 다음과 같은 출력을 얻을

private void sign(ActionEvent e) throws Exception { 
    byte[] data = read(file); 

    Signature sig = Signature.getInstance("SHA1withRSA"); 
    sig.initSign(keyPair.getPrivate()); 
    sig.update(data); 
    byte[] signatureBytes = sig.sign(); 

    String newFilePath = "output.file"; 

    int signatureLength = signatureBytes.length; 
    String signString = new BASE64Encoder().encode(signatureBytes); 

    RandomAccessFile raf = new RandomAccessFile(newFilePath, "rw"); 
    raf.writeInt(signatureLength); 
    raf.write(signatureBytes); 
    raf.write(data); 
    raf.close(); 

    verify(newFilePath, signatureBytes, data); 
} 

private void verify(String path, byte[] signature, byte[] originalMessage) throws Exception { 
    File f = new File(path); 

    RandomAccessFile raf = new RandomAccessFile(f.getPath(), "r"); 
    int sigLength = raf.readInt(); 
    byte[] signatureBytes = new byte[sigLength]; 
    raf.read(signatureBytes); 

    Long remainingLength = raf.length() - 1 - sigLength; 
    byte[] message = new byte[remainingLength.intValue()]; 
    raf.read(message); 

    raf.close(); 

    System.out.println("==== VERIFYING SIGNATURE ===="); 
    String originalString = new BASE64Encoder().encode(signature); 
    String newString = new BASE64Encoder().encode(signatureBytes); 

    System.out.println("originalString\n" + originalString); 
    System.out.println("newString\n" + newString); 

    System.out.println("Signatures match: " + newString.equals(originalString)); 

    System.out.println("==== VERIFYING MESSAGE ===="); 
    String originalMessageString = new String(originalMessage); 
    String messageString = new String(message); 
    System.out.println("originalMessageString = " + originalMessageString); 
    System.out.println("messageString = " + messageString); 
    System.out.println("Messages match: " + originalMessageString.equals(messageString)); 

    Signature sig = Signature.getInstance("SHA1withRSA"); 
    sig.initVerify(keyPair.getPublic()); 
    sig.update(message); 

    System.out.println(sig.verify(signatureBytes)); // false 
} 

가 :

==== VERIFYING SIGNATURE ==== 
originalString 
DU00HopnNgOnwPL4Y50lwR5CJFVCRqsj3hkdyareMqHPe4RKdCUr2FSNEuh0yq5LyzcP96MNDzNJ 
jVTTI8+V3SPMDzQIjw4Ibb+xM3/XZHQi5ej8XfVXao234QytRD5y1bWKxlZEh4BlnzXcqD9tmANB 
BOQTG3P15Ea0fFkDYpg= 
newString 
DU00HopnNgOnwPL4Y50lwR5CJFVCRqsj3hkdyareMqHPe4RKdCUr2FSNEuh0yq5LyzcP96MNDzNJ 
jVTTI8+V3SPMDzQIjw4Ibb+xM3/XZHQi5ej8XfVXao234QytRD5y1bWKxlZEh4BlnzXcqD9tmANB 
BOQTG3P15Ea0fFkDYpg= 
Signatures match: true 
==== VERIFYING MESSAGE ==== 
originalMessageString = Hoi 
messageString = Hoi 
Messages match: false <------ WTF 
false 

이 문제 해결에 어떤 도움 (파일은 문자열 "호이"를 포함하는 txt 파일입니다) 감사하겠습니다.

답변

1

messageString 뒤에 약간의 공백이있는 것 같습니다. 시도해보십시오

System.out.println("Messages match: " + originalMessageString.equals(messageString.trim())); 
+0

감사합니다, 그것은 보인다. 나는 그것이있는 곳을 찾고 싶습니다. Arrays.equals (originalMessage, message)를 사용하여'originalMessage'와'message'를 비교하면 false를 반환하므로 너무 많은 바이트를 읽었을 것입니다. –

0

remainingLength을 계산할 때 잘못된 오프셋을 사용했습니다. 파일의 첫 번째 정수를 보완하기 위해 전체 파일 길이 - 서명 길이에서 1을 차감했습니다. 나는 정수가 4 바이트라는 것을 깨달았다. 이 숫자를 4로 변경하면 문제가 해결되었습니다.

따라서,이 행은 다음과 같습니다 공간이 어딘가에처럼

Long remainingLength = raf.length() - 4 - sigLength; 
관련 문제