我正在向文件中写入一些数据(在这种情况下为字符串,但是由于使用byte []可能是任何东西),然后读取并比较结果。当我比较两个byte []时,它们在我看来都是相同的,但是运行.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
}


我得到以下输出:(该文件是一个包含字符串“ Hoi”的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


解决此问题的任何帮助将不胜感激。

最佳答案

我猜想messageString之后还有一些空间。尝试

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

10-07 19:10
查看更多