2016-06-20 7 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 
} 

私は次のような出力が得られます(ファイルが文字列「ホイ」を含むtxtファイルである)

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

この問題を解決する上の任意のヘルプを感謝されます。

答えて

1

messageStringの後にスペースがあると思います。お試しください

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

おかげで、それは思えません。私はそれがどこにあるかを見たいと思う。 'originalMessage'と' message'を 'Arrays.equals(originalMessage、message) 'を使って比較するとfalseを返すので、あまりにも多くのバイトを読み込んでいると思いますか? –

0

remainingLengthを計算する際に間違ったオフセットが使用されました。ファイルの最初の整数を補うために、ファイル長の合計 - 署名長から1を差し引いた。私は整数が4バイト長であることに気付きました。この数字を4に変更すると固定されました。

そのため、この行は次のようになります。スペースがどこかにあったよう

Long remainingLength = raf.length() - 4 - sigLength; 
関連する問題