MD5를 이용한 Message Digest
Message Digest는 가변길이 데이터를 입력받아 일정 크기의 결과값을 산출해내는 방식을 사용
그리고 그결과 값에서 원래의 데이터를 재생해 낼 수 없도록 만듬
MD5(16)와 SHA(20) 의 두 알고리즘이 기본적으로 제공된다.
import java.io.*;
import java.security.*;
public class MessageDigester {
public static void main(String[] args) throws Exception {
if (args.length<1) {
System.out.println("사용법 : java MessageDigester 문서이름");
System.exit(1);
}
MessageDigest md=MessageDigest.getInstance("MD5");
FileInputStream fis=new FileInputStream(args[0]);
byte[] data=new byte[fis.available()];
byte[] buf=new byte[1024];
for (int length=0, offset=0; (length=fis.read(buf))!=-1; ) {
System.arraycopy(buf, 0, data, offset, length);
offset+=length;
}
fis.close();
FileOutputStream fos=new FileOutputStream(args[0]+".md");
fos.write(md.digest(data)); // 16바이트 크기의 byte[]배열저장 (MD5)
fos.close();
System.out.println(args[0]+".md 파일을 생성.");
}
}
} |
import java.io.*;
import java.security.*;
public class MDChecker {
public static void main(String[] args) throws Exception {
if (args.length<2) {
System.out.println("사용법 : java MDChecker 문서이름 MD파일이름");
System.exit(1);
}
MessageDigest md=MessageDigest.getInstance("MD5");
FileInputStream fis=new FileInputStream(args[0]);
byte[] data=new byte[fis.available()];
byte[] buf=new byte[1024];
for (int length=0, offset=0; (length=fis.read(buf))!=-1; ) {
System.arraycopy(buf, 0, data, offset, length);
offset+=length;
}
fis.close();
byte[] originMD=md.digest(data);
fis=new FileInputStream(args[1]);
byte[] loadedMD=new byte[fis.available()];
fis.read(loadedMD);
fis.close();
if (checkMD(originMD, loadedMD)) {
System.out.println("동일한 문서임.");
} else {
System.out.println("동일하지 않은 문서임.");
}
}
static boolean checkMD(byte[] originMD, byte[] loadedMD) {
if (originMD.length!=loadedMD.length) {
return false;
}
for (int i=0; i<originMD.length; i++) {
if (originMD[i]!=loadedMD[i]) {
return false;
}
}
return true;
}
} |