신변잡기/생활의 재발견
생활 속의 코드 몇개
세렌디피티
2003. 5. 10. 00:00
아는 사람은 다 아는 이야기겠지만 그래도 적어두면 재미있을 것 같아 적는다. (요즘 읽고 있는 암호 관련 책들 때문에 코드에 관심이 부쩍 많아져서..)
글의 내용은 아래 세가지다.
1. 주민등록번호 체크하는 방법
2. 신용카드번호 체크하는 방법
3. 도서 ISBN 체크하는 방법
1. 주민등록번호 체크하는 방법
주민번호를 입력하라고 나오는 웹사이트나 주민등록번호 생성 프로그램이 이 알고리즘으로 동작한다. 요즘엔 실명까지 데이타베이스화 되어 있어서 주민번호 생성 프로그램이 별로 쓸모가 없는 모양이지만 한때는 이걸로 나쁜 짓들을? (난 아님 ^^;)
너무도 잘 알다시피 주민번호의 앞 여섯자리는 생년월일이다. 그리고 뒷 일곱자리의 첫번째 숫자는 성별(남자는 1, 여자는 2)이고 두번째부터 네번째 자리의 숫자는 지역코드, 다섯번째와 여섯번째 숫자는 일련번호(그 지역에서 그 날 첫번째 출생신고가 되면 01번이 되겠지요?), 그리고 마지막 일곱번째 숫자는 앞 12자리 숫자들이 맞는지 검증을 위한 숫자다.
검증방법은 다음과 같다. 주민번호가 720101-2411015 라고 하자. 맨 뒷자리 숫자만 빼고 첫번째 숫자부터 차례로 2,3,4,5,6,7,8,9,2,3,4,5 를 곱한 후 결과를 서로 더한다. 아래 예를 보면 분명해 진다.
(7*2) + (2*3) + (0*4) + (1*5) + (0*6) + (1*7) + (2*8) + (4*9) + (1*2) + (1*3) + (0*4) + (1*5) = 94
여기에서 계산 결과는 94. 이 수를 11로 나눈 나머지를 구한다. 94를 11로 나눈 나머지는 6이 되는데 마지막으로 이 나머지 6을 11에서 빼준 결과가 주민번호의 마지막 숫자와 일치하면 된다. 11-6=5. 일치. (만약 11에서 빼준 결과가 10 또는 11이 되면 이를 10으로 나눈 나머지를 검증숫자로 사용한다.)
얼마전 주민번호를 받은 둘리의 주민번호는 830422-1185600 이었다.
이것은 올바른 주민등록번호일까?
(참고기사: http://www.stoo.com/html/stooview/2003/0420/091925885813131100.html)
2. 신용카드번호 체크하는 방법
신용카드번호도 나름대로 규칙이 있다. 보통 16자리로 이루어지는 신용카드의 첫 두 개 숫자는 카드사의 고유번호(VISA는 45, Masters는 54 또는 55)이고 나머지 숫자는 일반/골드카드, 발행국가 등이 구분되고 나머지는 카드사 고유의 일련번호로 이루어져 있다고 한다. 여기에서는 올바른 신용카드인지 아닌지 체크하는 방법을 알아보자. 검증 알고리즘은 카드사마다 서로 다르지만 여기에선 VISA 카드를 예로 들어 본다.
VISA 카드번호가 0699 0043 1313 9642 라고 하자.
맨 오른쪽 숫자부터 시작하여 홀수번째 위치에 있는 숫자만 서로 더한다. 여기에서는 2 + 6 + 3 + 3 + 3 + 0 + 9 + 6 = 32 가 될 것이다.
그리고 이번에는 역시 맨 오른쪽 숫자부터 시작하여 짝수번째 숫자를 찾아 각 숫자에 2를 곱하여 서로 더한다. 만약 2를 곱한 결과가 9보다 크면 그 수에서 9를 뺀 결과를 취하여 서로 더한다. 여기에서는 (4*2) + ((9*2)-9) + (1*2) + (1*2) + (4*2) + (0*2) + ((9*2)-9) + (0*2) = 38 이 될 것이다.
마지막으로 위 두 결과를 서로 더하여 이 수가 10의 배수가 되는지 확인한다. 즉 10의 배수여야 유효한 VISA 카드 번호로 검증되는 것이다. 여기에서는 32 + 38 = 70 이므로 10의 배수가 되어 올바른 카드번호라고 할 수 있다.
내 경우 VISA 카드의 경우 이 알고리즘에 들어맞았고, 가지고 있는 타 신용카드(MASTER 카드)에도 적용하여 보았는데 우연인지 필연인지 10의 배수가 되었다. 어쩌면 MASTER 카드도 비자카드와 동일한 알고리즘을 사용하고 있는지 모른다. (MASTER카드를 소지한 분들, 체크하여 알려주시면 many thanks 합니다. ^^) 그리고 BC카드의 경우엔 들어맞지 않았다.
3. 도서 ISBN 체크하는 방법
출판되어 판매되는 책에는 고유한 번호가 찍혀 있다. 이른바 ISBN(International Standard Book Number). 이 고유한 번호는 일반적으로 xx-xxxx-xxx-x 형식을 따르며 총 10개 숫자로 이루어져 있는데 처음 두 숫자는 국가번호(예를 들면 한국은 89), 그 다음 일곱자리는 출판사 고유번호와 출판사에서 그 책에 부여한 시리얼번호, 마지막으로 맨 끝자리 숫자는 언급한 아홉 숫자들이 유효한 번호인지 검증하기 위한 검증숫자로 0부터 9까지의 숫자가 오게 되는데 만약 10이 되어야 하는 경우 로마 숫자 X로 표시한다. 이 검증숫자가 있음으로 해서 책 주문자가 ISBN을 잘못 넣어 엉뚱한 책을 주문하게 되는 오류를 피하게 되는 것이다.
검증하는 법을 따라하기 위해 곁에 있는 책을 집어 뒷페이지에 인쇄된 ISBN을 적어보자.
89-8401-066-9
첫번째 숫자에는 10을 곱하고 두번째 숫자에는 9, 세번째 숫자에는 8을 곱하여 끝에서 두번째 숫자에 2를 곱하는 일까지 수행하고 각 곱셈 결과를 서로 더한다.
즉, (8*10) + (9*9) + (8*8) + (4*7) + (0*6) + (1*5) + (0*4) + (6*3) + (6*2) = 288. 그리고 결과에 ISBN의 마지막 숫자를 더한다. 이 예에서는 288 + 9 = 297. 위와 같은 연산 뒤에 최종적으로 얻은 숫자는 반드시 11의 배수가 되어야 한다. 물론 297은 11의 배수이다.
위의 예에서 주민번호와 ISBN은 맨 끝자리 수를 검증을 위해 사용하고 있고 이 경우 11이라는 숫자가 한 역할을 함을 알 수 있다. 신용카드번호의 경우 더 복잡한 알고리즘을 따르는 것처럼 보이지만 원리를 아는 악의적인 사용자라면 얼마든지 신용카드번호를 생성해낼 수 있을 것이다. ^^*
글의 내용은 아래 세가지다.
1. 주민등록번호 체크하는 방법
2. 신용카드번호 체크하는 방법
3. 도서 ISBN 체크하는 방법
1. 주민등록번호 체크하는 방법
주민번호를 입력하라고 나오는 웹사이트나 주민등록번호 생성 프로그램이 이 알고리즘으로 동작한다. 요즘엔 실명까지 데이타베이스화 되어 있어서 주민번호 생성 프로그램이 별로 쓸모가 없는 모양이지만 한때는 이걸로 나쁜 짓들을? (난 아님 ^^;)
너무도 잘 알다시피 주민번호의 앞 여섯자리는 생년월일이다. 그리고 뒷 일곱자리의 첫번째 숫자는 성별(남자는 1, 여자는 2)이고 두번째부터 네번째 자리의 숫자는 지역코드, 다섯번째와 여섯번째 숫자는 일련번호(그 지역에서 그 날 첫번째 출생신고가 되면 01번이 되겠지요?), 그리고 마지막 일곱번째 숫자는 앞 12자리 숫자들이 맞는지 검증을 위한 숫자다.
검증방법은 다음과 같다. 주민번호가 720101-2411015 라고 하자. 맨 뒷자리 숫자만 빼고 첫번째 숫자부터 차례로 2,3,4,5,6,7,8,9,2,3,4,5 를 곱한 후 결과를 서로 더한다. 아래 예를 보면 분명해 진다.
(7*2) + (2*3) + (0*4) + (1*5) + (0*6) + (1*7) + (2*8) + (4*9) + (1*2) + (1*3) + (0*4) + (1*5) = 94
여기에서 계산 결과는 94. 이 수를 11로 나눈 나머지를 구한다. 94를 11로 나눈 나머지는 6이 되는데 마지막으로 이 나머지 6을 11에서 빼준 결과가 주민번호의 마지막 숫자와 일치하면 된다. 11-6=5. 일치. (만약 11에서 빼준 결과가 10 또는 11이 되면 이를 10으로 나눈 나머지를 검증숫자로 사용한다.)

얼마전 주민번호를 받은 둘리의 주민번호는 830422-1185600 이었다.
이것은 올바른 주민등록번호일까?
(참고기사: http://www.stoo.com/html/stooview/2003/0420/091925885813131100.html)
2. 신용카드번호 체크하는 방법
신용카드번호도 나름대로 규칙이 있다. 보통 16자리로 이루어지는 신용카드의 첫 두 개 숫자는 카드사의 고유번호(VISA는 45, Masters는 54 또는 55)이고 나머지 숫자는 일반/골드카드, 발행국가 등이 구분되고 나머지는 카드사 고유의 일련번호로 이루어져 있다고 한다. 여기에서는 올바른 신용카드인지 아닌지 체크하는 방법을 알아보자. 검증 알고리즘은 카드사마다 서로 다르지만 여기에선 VISA 카드를 예로 들어 본다.
VISA 카드번호가 0699 0043 1313 9642 라고 하자.
맨 오른쪽 숫자부터 시작하여 홀수번째 위치에 있는 숫자만 서로 더한다. 여기에서는 2 + 6 + 3 + 3 + 3 + 0 + 9 + 6 = 32 가 될 것이다.
그리고 이번에는 역시 맨 오른쪽 숫자부터 시작하여 짝수번째 숫자를 찾아 각 숫자에 2를 곱하여 서로 더한다. 만약 2를 곱한 결과가 9보다 크면 그 수에서 9를 뺀 결과를 취하여 서로 더한다. 여기에서는 (4*2) + ((9*2)-9) + (1*2) + (1*2) + (4*2) + (0*2) + ((9*2)-9) + (0*2) = 38 이 될 것이다.
마지막으로 위 두 결과를 서로 더하여 이 수가 10의 배수가 되는지 확인한다. 즉 10의 배수여야 유효한 VISA 카드 번호로 검증되는 것이다. 여기에서는 32 + 38 = 70 이므로 10의 배수가 되어 올바른 카드번호라고 할 수 있다.
내 경우 VISA 카드의 경우 이 알고리즘에 들어맞았고, 가지고 있는 타 신용카드(MASTER 카드)에도 적용하여 보았는데 우연인지 필연인지 10의 배수가 되었다. 어쩌면 MASTER 카드도 비자카드와 동일한 알고리즘을 사용하고 있는지 모른다. (MASTER카드를 소지한 분들, 체크하여 알려주시면 many thanks 합니다. ^^) 그리고 BC카드의 경우엔 들어맞지 않았다.
3. 도서 ISBN 체크하는 방법
출판되어 판매되는 책에는 고유한 번호가 찍혀 있다. 이른바 ISBN(International Standard Book Number). 이 고유한 번호는 일반적으로 xx-xxxx-xxx-x 형식을 따르며 총 10개 숫자로 이루어져 있는데 처음 두 숫자는 국가번호(예를 들면 한국은 89), 그 다음 일곱자리는 출판사 고유번호와 출판사에서 그 책에 부여한 시리얼번호, 마지막으로 맨 끝자리 숫자는 언급한 아홉 숫자들이 유효한 번호인지 검증하기 위한 검증숫자로 0부터 9까지의 숫자가 오게 되는데 만약 10이 되어야 하는 경우 로마 숫자 X로 표시한다. 이 검증숫자가 있음으로 해서 책 주문자가 ISBN을 잘못 넣어 엉뚱한 책을 주문하게 되는 오류를 피하게 되는 것이다.
검증하는 법을 따라하기 위해 곁에 있는 책을 집어 뒷페이지에 인쇄된 ISBN을 적어보자.
89-8401-066-9
첫번째 숫자에는 10을 곱하고 두번째 숫자에는 9, 세번째 숫자에는 8을 곱하여 끝에서 두번째 숫자에 2를 곱하는 일까지 수행하고 각 곱셈 결과를 서로 더한다.
즉, (8*10) + (9*9) + (8*8) + (4*7) + (0*6) + (1*5) + (0*4) + (6*3) + (6*2) = 288. 그리고 결과에 ISBN의 마지막 숫자를 더한다. 이 예에서는 288 + 9 = 297. 위와 같은 연산 뒤에 최종적으로 얻은 숫자는 반드시 11의 배수가 되어야 한다. 물론 297은 11의 배수이다.
위의 예에서 주민번호와 ISBN은 맨 끝자리 수를 검증을 위해 사용하고 있고 이 경우 11이라는 숫자가 한 역할을 함을 알 수 있다. 신용카드번호의 경우 더 복잡한 알고리즘을 따르는 것처럼 보이지만 원리를 아는 악의적인 사용자라면 얼마든지 신용카드번호를 생성해낼 수 있을 것이다. ^^*