안녕하세요? 맨날맑음 입니다.

회원가입 기능을 구현하다 보면, 주민등록번호가 올바른지 체크해야 하는 경우가 생기게 됩니다.
우선 주민등록번호가 어떠한 형태(?)로 이루어 졌는지 알아 볼 필요가 있습니다.

주민등록번호는 총 13자리 숫자로 구성되어 있습니다.
모두 아시는 바와같이 앞의 6자리는 태어난 날의 년, 월, 일을 나타냅니다  
뒤의 7자리는 조금 복잡한데요. 
 # 1번 자리 : 성별 (ex. 남자 : 1또는3, 여자 : 2또는4)
    - 3과 4는 낮설겠지만 00년 이후 출생자부터는 남자는 3 여자는 4입니다.
 # 2~5번 자리 : 출생 신고 당시의 거주지 관할 동사무소의 지역코드
 # 6번 자리 : 출생 신고 날짜
 # 7번 자리 : 검정 코드
    - 7번 자리가 매우 중요합니다. 이것은 앞의 12자리의 유효성을 검증해 줄 매직넘버(?)로 쓰이게 됩니다. 

주민등록번호의 유효성을 알아 보기 위해서는 각 자리수의 미리 지정된 값을 곱하여, 곱한 결과를 전부 더하고,
그 값을 11로 나눈 후, 그 결과 값(나머지)11에서 빼어 13번째 자리수인 검정 코드와 일치하면 유효하게 됩니다.
참.. 말로 할려니 쉽지 않습니다.

주민등록번호가 123456 - 1234567 이라고 예를 들어 보겠습니다.
# 1. 아래와 같이 검정 코드인 7을 제외한 각자리에 미리 지정된 값(234567892345)을 각각 곱하여 줍니다.

# 2. 각 자리에서 곱한 결과를 모두 더해 줍니다.

# 3. 더한 결과(206)을 11로 나누어 줍니다(% 나머지 연산).

# 4. 11에서 나머지의 결과를 빼줍니다.

# 5. 나머지 3과 검증코드 7이 같은지 확인 합니다. 같으면 유효한 주민등록번호입니다. 이 경우 11에서 10을 뺀다던지, 1을 빼면 2자리의 결과가 나오게 됩니다. 그럴때는 뒤의 1자리만 취하여 비교하시면 됩니다. (이와같은 이유로 4번의 결과에 % 연산으로 10을 한번 더해주면 뒤의 1자리만 취할 수 있겠죠?)

# 결론 . 주민등록번호 123456 - 1234567는 틀린 주민번호 입니다!


C# 코드로 만들어 보겠습니다.
코드 작성시 고려 사항
  # 1. 주민등록번호가 13자리 인가?
  # 2. 13자리 모두 숫자인가?
  # 3. 위의 공식에 부합하는가?

bool IsAvailableRRN(string RRN)

{

    //공백 제거

    RRN = RRN.Replace(" ", "");

    //문자 '-' 제거

    RRN = RRN.Replace("-", "");

    //주민등록번호가 13자리인가?

    if (RRN.Length != 13)

    {

        return false;

    }

 

    int sum = 0;

    for (int i = 0; i < RRN.Length - 1; i++)

    {

        char c = RRN[i];

        //숫자로 이루어져 있는가?

        if (!char.IsNumber(c))

        {

            return false;

        }

        else

        {

            if (i < RRN.Length)

            {

                //지정된 숫자로 자리를 나눈 더한다.

                sum += int.Parse(c.ToString()) * ((i % 8) + 2);

            }

        }

    }

    // 검증코드와 결과 값이 같은가?

    if (!((((11 - (sum % 11)) % 10).ToString()) == ((RRN[RRN.Length - 1]).ToString())))

    {

        return false;

    }

    return true;

}

Posted by 맨날맑음

댓글을 달아 주세요

  1. Favicon of http://dklee.net BlogIcon DKLEE 2009.08.05 22:32  댓글주소  수정/삭제  댓글쓰기

    이 원리만 알면 역으로??

  2. Favicon of http://dklee.net BlogIcon DKLEE 2009.08.06 21:31  댓글주소  수정/삭제  댓글쓰기

    이젠 생성기가 필요 없는 나이가...ㅎㄷㄷ

  3. Favicon of https://bit4me.tistory.com BlogIcon 心深™ 2009.08.14 13:43 신고  댓글주소  수정/삭제  댓글쓰기

    역으로??
    사실 그럴 필요가 없습니다.
    마지막 검증 코드 있지 않습니까? 그게 사실 0-9까지 순차적으로 10번만 입력해보면 결국 하나는 맞게되어 유효성 검증이 완료됩니다 ^^;
    흠..이거 은근 불법적인 정보인가요?
    유효성 검증 방법이 포트란 교재에 실린 그 때부터니 전 안잡혀가겠죠.
    전 그냥 배움을 원하는 네티즌일 뿐인걸요^^ ㄷㄷㄷ

  4. 내가니악마다 2009.10.20 13:27 신고  댓글주소  수정/삭제  댓글쓰기

    맨날맑음님은 아직도 생성기 써서 이상한 싸이트 가입 한다는 소문이..

  5. dfssdf 2010.03.14 23:14  댓글주소  수정/삭제  댓글쓰기

    이름, 생년월일만 알면 주민번호 다 털립니다 대통령부터 연예인 옆집 아줌마까지 주민번호 다 털어요 각종 범죄에도 많이 이용되겠죠 초등학생도 손쉽게 털 수 있을만큼 허술함ㅋㅋ 남자,여자는 안다고 치고 손으로 여섯자리 일일히 치는걸 프로그램 만들어서 돌린다고 치면 30분도 안되서 털림

  6. Favicon of http://lol.shoxskosl.com BlogIcon nike shox 2013.04.07 00:44  댓글주소  수정/삭제  댓글쓰기

    지독한 네게 의미를 준 너의 사랑, http://lol.shoxskoas.com nike sko

  7. secuof 2013.05.27 21:09  댓글주소  수정/삭제  댓글쓰기

    잘 보고 퍼가요 ~~~

  8. Favicon of http://3129.nmactc.org/media/oakley.php BlogIcon Cheap Oakley sunglasses 2013.07.27 09:42  댓글주소  수정/삭제  댓글쓰기

    좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구

  9. Favicon of https://lena19760323.tistory.com BlogIcon 19760323 2017.06.15 13:35 신고  댓글주소  수정/삭제  댓글쓰기

    고맙습니다 퍼갈게여^^