2016-06-20 21 views
1

Ich schreibe einige Daten in eine Datei (eine Zeichenfolge in diesem Fall, aber könnte etwas sein, da ich byte []) verwende, danach lese ich es und das Ergebnis vergleichen. Wenn ich beide byte [] 's vergleiche, sehen sie für mich gleich aus, aber .equals() gibt false zurück.String geändert nach dem Schreiben in und Lesen von Datei

finden Sie meinen Code unten:

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 
} 

ich folgende Ausgabe: (Die Datei eine txt-Datei ist die Zeichenfolge "Hoi" enthalten)

==== 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 

Jede Hilfe zu der Lösung dieses Problems würde geschätzt werden.

Antwort

1

Ich denke, Sie haben etwas Platz nach messageString. Versuchen

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

Danke, es scheint, als gäbe es einen Raum, irgendwo war. Ich würde gerne herausfinden, wo es ist. das Vergleichen von 'originalMessage' und' message' mit 'Arrays.equals (originalMessage, message)' gibt false zurück, also schätze ich, dass ich zu viele Bytes lese? –

0

habe ich die falsche Offset, wenn remainingLength Berechnung. Ich habe 1 von der Gesamtlänge der Dateilänge - Signaturlänge abgezogen, um die erste ganze Zahl in der Datei zu kompensieren. Ich erkannte dann, dass ganze Zahlen 4 Bytes lang sind. Ändern Sie diese Zahl auf 4 behoben.

Als solche soll diese Linie sein:

Long remainingLength = raf.length() - 4 - sigLength;