주민등록번호 검증 알고리즘 (체크섬)

C#에서 주민등록번호 맨 뒷자리에 대한 검증 알고리즘 예제 자료를 안내해드리겠습니다.

주민등록번호 검증 규칙

주민등록번호 검증과 관련하여 주민등록번호의 연혁을 알아보도록 하겠습니다. 지금까지 총 3회의 역사가 있습니다. 첫 번째는 주민등록번호 최초 도입(1968년 9월 ~1975년 10월), 그리고 오늘 알아볼 주제인 검증규칙이 있는 주민등록번호체계(1975년 10월 ~ 2020년 10월), 마지막으로 2020년 10월부터 검증규칙이 폐지된 주민등록번호입니다. 작성일자를 기준으로 신규 주민등록번호를 발급받은 아이들은 4살 정도 되었겠군요.

주민등록번호 최초 도입 (1968년 9월~)

1968년 9월 주민등록번호가 최초로 도입되었을 때에는 등록번호 앞자리가 지역번호였고 뒷자리는 현재와 같이 첫 째자리가 성별 구분, 그 다음은 일련번호였습니다. 예시 자료는 110101-123456입니다.

  • 110101 => 앞자리 6자리는 지역번호 읍면동 번호 6자리를 사용합니다.
  • 1 => 뒷자리 첫 째자리는 성별입니다. 현재에도 유효한 규칙으로 숫자에 따라 성별을 알 수 있습니다. (남자 1, 여자 2)
  • 23456 => 성별 자리 이후에는 일련번호가 발급되었습니다. 주민등록번호를 최초로 발급받은 박정희 대통령은 뒷자리가 100001입니다. (일련번호 1)

주민등록번호 검증번호 추가 (1975년 10월~)

1975년 10월부터 새로 검증번호가 추가되어 도입된 주민등록번호 검증체계입니다. 오늘 주제는 이 주민등록번호와 관련이 있습니다. 제 주민등록번호 또한 이 규칙에 속합니다. 예시자료는 820701-2345678 입니다.

  • 820701 => 생년월일을 뜻합니다. 1982년 7월 1일이 생일인 것을 알 수 있습니다.
  • 2 => 주민등록버놓 뒷 자리 첫 째자리는 종전과 동일하게 성별을 나타냅니다.
    1 => 1900년생 남성
    2 => 1900년생 여성
    3 => 2000년생 남성
    4 => 2000년생 여성
    5 => 1900년생 외국인 남성
    6 => 1900년생 외국인 여성
    7 => 2000년생 외국인 남성
    8 => 2000년생 외국인 여생
  • 3456 => 읍, 면, 동 고유번호
  • 7 => 신고순서에 따른 일련번호로 1부터 9까지입니다. 웬만하면 1인데 쌍둥이이거나, 신고 건수가 많다면 2 또는 3일 수도 있습니다. 저희 집은 모두 1이네요.
  • 8 => 주민등록번호 검증번호입니다. 앞의 12자리 숫자를 산식에 따라 산출한 결과를 기입합니다. 반대로 말하자면, 이 값을 역산한 값이 검증 규칙에 불일치하는 경우 주민등록번호를 허위로 작성하였거나 오기입한 경우라 할 수 있습니다.

2020년 10월생 주민등록번호 규칙 (2020년 10월~)

주민등록번호 변경사항

2020년 10월부터 검증 규칙이 폐지되었습니다. 앞으로 어떻게 갈지는 모르겠으나, 2020년 10월생부터는 검증규칙을 제외하도록 추가해야 합니다.

주민등록번호 검증 알고리즘 (체크섬)

주민등록번호 검증번호는 다음과 같습니다. 주민등록번호 앞자리 12자리까지의 값을 ABCDEF-GHIJKL 이라고 할 때에 다음과 같이 구합니다. 나눈값의 나머지를 MOD라 하겠습니다.

검증번호 = ( 11 - (2A+3B+4C+5D+6E+7F+8G+9H+2I+3J+4K+5L)MOD(11) )MOD(10)

다음과 같이 주민등록번호를 검증해 볼 수 있습니다.

검증하려는 번호 13자리를 입력해 주세요





검증번호 :

<!DOCTYPE html>
<html>
<head>
    <style>
        #btnCheckSumBeomSang {
            padding: 12px 24px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }
        #btnCheckSumBeomSang:hover {
            background-color: #3e8e41;
        }
    </style>
	<script>
		function checkSumBeomSang() {
			var inputBeomSang = document.getElementById("inputBeomSang").value;
                  clearResultBeomSang();
			if (inputBeomSang.length !== 13 || isNaN(inputBeomSang)) {
                        document.getElementById("resultBeomSang").innerHTML = "없음";
				document.getElementById("result2BeomSang").innerHTML = "검증할 번호 13자리를 입력해 주세요.";
				return;
			}
			var weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
			var sum = 0;
			for (var i = 0; i < inputBeomSang.length - 1; i++) {
				var digit = parseInt(inputBeomSang[i]);
				sum += digit * weights[i];
			}
			var checkSum = 11 - (sum % 11);
			if (checkSum == 10) {
				checkSum = 0;
			} else if (checkSum == 11) {
				checkSum = 1;
			}
			document.getElementById("resultBeomSang").innerHTML = checkSum;
			document.getElementById("result2BeomSang").innerHTML = (checkSum == inputBeomSang[12]) ? "검증번호와 입력 번호의 마지막 자리가 일치합니다." : "검증번호와 입력 번호의 마지막 자리가 일치하지 않습니다.";
			if (checkSum != inputBeomSang[12]) {
                        document.getElementById("result2BeomSang").style.color = "red";
			} else {
                        document.getElementById("result2BeomSang").style.color = "blue";
			}
		}
		
		function clearResultBeomSang() {
			document.getElementById("resultBeomSang").innerHTML = "";
			document.getElementById("result2BeomSang").innerHTML = "";
		}
	</script>
</head>
<body>
	<p>검증하려는 번호 13자리를 입력해 주세요
	<br><br><input type="text" id="inputBeomSang" pattern="\d{13}" oninput="this.value = this.value.replace(/[^0-9]/g, '').substring(0, 13); clearResultBeomSang();" maxlength="13"><br><br>
	<button id="btnCheckSumBeomSang" onclick="checkSumBeomSang()">검증</button>
	<br><br>검증번호 : <span id="resultBeomSang"></span>
      <br><br><span id="result2BeomSang"></span></p>
</body>
</html>

C#으로 하는 예제자료는 다음과 같습니다.

void BeomSang()
{
    var inputBeomSang = "9912311999999";
    string resultBeomSang = string.Empty;
    if (inputBeomSang.Length != 13 || !long.TryParse(inputBeomSang, out long result))
    {
        resultBeomSang = "검증할 번호 13자리를 입력해 주세요.";
        return;
    }
    int[] weights = { 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 };
    long sum = 0;
    for (int i = 0; i < inputBeomSang.Length - 1; i++)
    {
        int digit = int.Parse(inputBeomSang[i].ToString());
        sum += digit * weights[i];
    }
    int checkSum = 11 - (int)(sum % 11);
    if (checkSum == 10)
    {
        checkSum = 0;
    }
    else if (checkSum == 11)
    {
        checkSum = 1;
    }
    resultBeomSang = checkSum == int.Parse(inputBeomSang[12].ToString()) ? "검증번호와 입력 번호의 마지막 자리가 일치합니다." : "검증번호와 입력 번호의 마지막 자리가 일치하지 않습니다.";
    Debug.WriteLine(resultBeomSang);
}

댓글