파일에 데이터를 쓰고 있습니다. (이 경우 문자열이지만, 바이트를 사용하고 있기 때문에 아무 것도 될 수 있습니다.) 결과를 비교하는 것. 두 바이트 []를 비교하면 똑같아 보이지만, .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 파일입니다) 감사하겠습니다.
감사합니다, 그것은 보인다. 나는 그것이있는 곳을 찾고 싶습니다. Arrays.equals (originalMessage, message)를 사용하여'originalMessage'와'message'를 비교하면 false를 반환하므로 너무 많은 바이트를 읽었을 것입니다. –