プロジェクトのニーズにより、オンライン情報に基づいて ID カード検証用の C# メソッドを作成しました。このメソッドは VS2005[C/S] で作成されました。
/*
*理論的な部分:
※15桁のID番号=市外局番6桁+誕生日6桁+シリアルナンバー3桁
※18桁のID番号=市外局番6桁+誕生日8桁+シリアル番号3桁+認証コード1桁
*
*各省、都市、地域の国番号の最初の 2 桁は次のとおりです。
* 北京 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「Citizen Identity Number」は GB11643-1989「Social Security Number」の改訂版であり、元の規格名である「Social Security Number」が「Citizen Identity Number」に変更されると記載されています。 「市民識別番号」 施行日より GB11643-1989 に置き換わります。
※国民識別番号は、17桁のボディコードと1桁のチェックコードからなる特徴的な組み合わせコードです。左から右へ、6 桁の住所コード、8 桁の生年月日コード、3 桁のシーケンス コード、1 桁のチェック コードの順です。その意味は次のとおりです。
*1. 住所コード: コーディング対象の本拠地が所在する郡 (市、旗、地区) の行政区画コードを示し、GB/T2260 の規定に従って実装されます。
※2. 生年月日コード:符号化オブジェクトの誕生年、月、日を表し、GB/T7408の規定に従って実装されています。それぞれ 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 /// IDカードの確認
3 /// まとめ>
4 /// ID カード番号
5 /// <リターン>リターン>
6 public bool CheckIDCard(文字列ID)
7 {
8 if (Id.Length == 18)
9 {
10 ブールチェック = CheckIDCard18(Id);
11 リターンチェック。
12}
13 else if (Id.Length == 15)
14 {
15 ブールチェック = CheckIDCard15(Id);
16 リターンチェック。
17}
その他18
19 {
20 偽を返します。
21 }
22 }
23 /// <概要>
24 /// 18桁のIDカード認証
25 /// まとめ>
26 /// ID カード番号
27 /// <リターン>リターン>
28 private 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 return false;//番号の検証
34}
35 文字列アドレス = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36 if (address.IndexOf(Id.Remove(2)) == -1)
37 {
38 return false;//都道府県の検証
39 }
40 文字列誕生 = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
41 DateTime 時刻 = new DateTime();
42 if (DateTime.TryParse(出生時間, 出生時間) == false)
43 {
44 return false;//誕生日認証
45 }
46 string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47 string[] 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 整数合計 = 0;
(int i = 0; i < 17; i++) の場合は 50
51 {
52 合計 += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
53}
54 int y = -1;
55 Math.DivRem(sum, 11, out y);
56 if (arrVarifyCode[y] != Id.Substring(17, 1).ToLower())
57 {
58 return false;//認証コードの検証
59 }
60 return true // GB11643-1999 規格に準拠
61 }
62 /// <概要>
63 /// 15桁のIDカード認証
64 /// 概要>
65 /// ID カード番号
66 /// <リターン>リターン>
67 プライベート ブール CheckIDCard15(文字列 ID)
68 {
69 長い n = 0;
70 if (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 return false;//番号の検証
73}
74 文字列アドレス = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 if (address.IndexOf(Id.Remove(2)) == -1)
76 {
77 return false;//都道府県の検証
78 }
79 文字列誕生 = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
80 DateTime 時刻 = new DateTime();
81 if (DateTime.TryParse(出生時間, 出生時間) == false)
82 {
83 return false;//誕生日認証
84}
85 return true;//15桁IDカード規格に準拠