프로젝트 요구로 인해 온라인 정보를 기반으로 ID 카드 확인을 위한 C# 방법을 작성했습니다. 이 방법은 VS2005[C/S]에서 작성되었습니다.
/*
*이론적인 부분:
* 주민등록번호 15자리 = 지역번호 6자리 + 생일 6자리 + 일련번호 3자리
* 주민등록번호 18자리 = 지역번호 6자리 + 생일 8자리 + 일련번호 3자리 + 인증번호 1자리
*
*각 도, 시, 지역의 국가번호 앞 두 자리는 다음과 같습니다.
* 북경 11 길림 22 복건 35 광동 44 운남 53 천진 12 흑룡강 23 장시 36 광시 45 티베트 54 허베이 13 상하이 31 산둥 37 하이난 46 산시 61 산시 14 장쑤 32 허난 41 충칭 50
간쑤성 62 내몽골 15 절강성 33 호북성 42 쓰촨성 51 칭하이성 63 랴오닝성 21 안휘성 34 후난성 43 구이저우성 52 닝샤성 64 신장성 65 대만 71 홍콩 81 마카오 82 해외 91
*18자리 ID 카드 표준은 1999년 7월 1일 국가 품질 기술 감독국에서 시행한 GB11643-1999 "시민 식별 번호"에 명확하게 규정되어 있습니다.
*GB11643-1999 "시민 식별 번호"는 GB11643-1989 "사회 보장 번호"의 개정판으로, 원래 표준 이름인 "사회 보장 번호"가 "시민 식별 번호"로 변경됩니다. "시민 식별 번호" 시행일부터 GB11643-1989를 대체합니다.
*주민등록번호는 17자리의 신체코드와 1자리의 체크코드로 구성된 특징적인 조합코드입니다. 왼쪽부터 순서대로 주소코드 6자리, 생년월일코드 8자리, 시퀀스코드 3자리, 체크코드 1자리입니다. 그 의미는 다음과 같습니다.
*1. 주소 코드: 코드 대상의 영구 거주지가 위치한 현(시, 배너, 구)의 행정 구역 코드를 나타내며 GB/T2260 규정에 따라 시행됩니다.
*2. 생년월일 코드: 인코딩 대상이 태어난 연월일을 나타냅니다. 연월일은 4자리로 표시됩니다. 구분 기호 없이 각각 2자리와 2자리입니다.
*3.순번코드: 동일한 주소로 식별되는 지역 내에서 같은 연도, 같은 월, 같은 날에 태어난 사람에게 부여된 일련번호를 나타냅니다. 일련번호 중 홀수는 남성에게 부여됩니다. 암컷에게 배정됨.
*검증 계산 방법:
*1. 온톨로지 코드의 처음 17자리에 대한 가중합
*공식은 다음과 같습니다: S = Sum(Ai * Wi), i = 0, ... , 16
*여기서 Ai는 i번째 위치의 ID 카드 번호의 디지털 값을 나타내고, Wi는 i번째 위치의 가중치를 나타내며 해당 값은 다음과 같습니다.
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2. 계산 결과를 모듈로 11로 가져옵니다.
*Y = mod(S, 11)
*3. 모듈 값을 기준으로 얻은 검사 코드 간의 해당 관계는 다음과 같습니다.
*Y 값: 0 1 2 3 4 5 6 7 8 9 10
*코드 확인: 1 0 X 9 8 7 6 5 4 3 2
*/
암호
1 /// <요약>
2 /// 신분증 확인
3 /// </summary>
4 /// <param name="Id">신분증 번호</param>
5 /// <반환></반환>
6 공개 bool CheckIDCard(문자열 ID)
7 {
8 if (ID.길이 == 18)
9 {
10 bool check = CheckIDCard18(Id);
11 반환 수표;
12}
13 else if (Id.Length == 15)
14 {
15 bool check = CheckIDCard15(Id);
16 반품 확인;
17}
그 외 18개
19 {
20은 거짓을 반환합니다.
스물 하나 }
스물 둘 }
23 /// <요약>
24 /// 신분증 18자리 인증
25 /// </summary>
26 /// <param name="Id">신분증번호</param>
27 /// <반환></반환>
28 개인 bool CheckIDCard18(문자열 Id)
29 {
30 길이 n = 0;
31 if (long.TryParse(Id.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(Id.Replace('x', '0') .Replace('X', '0'), out n) == false)
32 {
33 false를 반환;//번호 확인
34}
35 문자열 주소 = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36 if (address.IndexOf(Id.Remove(2)) == -1)
37 {
38 false 반환;//지방 확인
39 }
40 문자열 탄생 = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
41 DateTime 시간 = new DateTime();
42 if (DateTime.TryParse(birth, out time) == false)
43 {
44 false 반환;//생일 확인
45 }
46 string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47 문자열[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',') ;
48 char[] Ai = Id.Remove(17).ToCharArray();
49 int 합계 = 0;
50 for (int i = 0; i < 17; i++)
51 {
52 sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
53}
54 int y = -1;
55 Math.DivRem(합계, 11, 출력 y);
56 if (arrVarifyCode[y] != Id.Substring(17, 1).ToLower())
57 {
58 false를 반환;//인증 코드 확인
59 }
60 반환 true; //GB11643-1999 표준을 준수합니다.
61 }
62 /// <요약>
63 /// 신분증 15자리 인증
64 /// </summary>
65 /// <param name="Id">신분증번호</param>
66 /// <반환></반환>
67 private bool CheckIDCard15(문자열 ID)
68 {
69 긴 n = 0;
70 if (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 false를 반환;//번호 확인
73}
74 문자열 주소 = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 if (address.IndexOf(Id.Remove(2)) == -1)
76 {
77 false 반환;//지방 확인
78 }
79 문자열 생성 = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
80 DateTime 시간 = 새로운 DateTime();
81 if (DateTime.TryParse(birth, out time) == false)
82 {
83 false를 반환;//생일 확인
84}
85 return true;//15자리 ID 카드 표준을 따릅니다.