[Java] 주민등록번호 MD5 복호화 Java

*전제조건 : 생년월일 데이터 있는 경우
*동작 내용
-주민등록번호 뒷자리만 MD5로 암호화된 정보를 복호화
-생년월일이 정확하다는 가정하에 동작
-주민등록번호 검증 코드를 이용하여 복호화
* 참고 :  효율적인 코드는 아니나, 문제 해결 접근 방식 차원에서 참고.
/-*
 * 주민번호 뒷자리 복호화된 데이터
 * @param user
 * @return
 *-
public String getId(UserBean user) {
//검증코드를 제외한 6자리만 무차별 대입
int tailId = 100000; //뒷자리 시작 범위
int tailMax = 300000; //뒷자리 종료 범위
//2000년 이후 출생자의 경우 남자는 3, 여자는 4 이므로 그에따른 범위 재설정
if(user.getIdnum_1().substring(0, 1).equals("0")) {
tailId = 300000;
tailMax = 500000;
}
//암호화된 데이터와 동일한지 여부 판별(무차별 대입)
while(tailId<tailMax) {
//주민번호의 검증코드(마지막자리)가 생성된 뒷자리
String testStr = makeCompareCode(user.getIdnum_1()+tailId);
String md5Id = enc.MD5(""+tailId + testStr); //주민번호 뒷자리만 MD5 암호화
//생성된 암호 코드와 기존 암호 코드와 동일 여부 판별
if(user.getCd().toLowerCase().equals(md5Id.toLowerCase())) {
return ""+tailId + testStr;
}
tailId++;
}
return null;
}
/-*
 * 검증 코드가 부여된 주민번호 뒷자리
 * @param id
 * @return
 *-
private String makeCompareCode(String id) {
String result = new String();
if(id.length() == 12) { //생년월일과 검증코드를 제외한 뒷자리가 12자리 인지 확인
int multiNum = 2; //주민번호 검증 방법은 2~9까지 순환으로 각 자리수에 곱셈을하므로, 곱셈을 위한 변수
int sum = 0; //각 자리수의 곱셈 결과 저장하여 합
for(int i=0;i<id.length();i++) {
if(multiNum == 10) { //2~9 순환을 위한 조건문
multiNum = 2;
}
sum = sum + (Integer.parseInt(""+id.charAt(i)) * multiNum ); //각 자리수를 곱함
multiNum++;
}
// 각 자리수의 곱한 값을 11로 뺀 수가 검증 코드. 10또는 11일 경우에는 1의 자리만 검증코드로 사용
result = ""+(11-(sum%11)) % 10;
}
return result;
}

덧글

댓글 입력 영역