php認証身分証明書番号
身分証明書番号の構成
身分証明書番号は、17ビットのデジタルボリュームコードと1ビットの検証コードからなる特徴的な組合せコードである.
配列順序は左から右に、6桁のデジタルアドレスコード、8桁のデジタル生年月日コード、3桁のデジタル順序コード、および1桁のデジタル検証コードである.
アドレスコード(上位6桁)
コードの対象を示す常住戸籍の所在県(市、旗、区)の行政区画コードは、GB/T 2260の規定に従って実行される.
生年月日コード(7位から14位)
符号化対象が生まれた年、月、日を表し、GB/T 7408の規定に従って実行し、年、月、日コードの間に区切り記号を使わない.
シーヶンスコード(15~17ビット)
同じアドレスコードに表示されるエリア範囲で、同年、同月、同日生まれの人に対して編成された順番番号を示し、順番コード奇数は男性に、偶数は女性に割り当てられる.
チェツクコード(18桁目)
1.十七桁数字本体コード重み付け加算式
S= SUM(Ai * Wi), i=0, ... , 16,まず上位17桁の数字の重みを求める.
Ai:i番目の位置を示す身分証明書番号の数値
Wi:i番目の位置の重み係数を示す
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.計算モジュール
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 2
認証方法:
身分証明書番号は、17ビットのデジタルボリュームコードと1ビットの検証コードからなる特徴的な組合せコードである.
配列順序は左から右に、6桁のデジタルアドレスコード、8桁のデジタル生年月日コード、3桁のデジタル順序コード、および1桁のデジタル検証コードである.
アドレスコード(上位6桁)
コードの対象を示す常住戸籍の所在県(市、旗、区)の行政区画コードは、GB/T 2260の規定に従って実行される.
生年月日コード(7位から14位)
符号化対象が生まれた年、月、日を表し、GB/T 7408の規定に従って実行し、年、月、日コードの間に区切り記号を使わない.
シーヶンスコード(15~17ビット)
同じアドレスコードに表示されるエリア範囲で、同年、同月、同日生まれの人に対して編成された順番番号を示し、順番コード奇数は男性に、偶数は女性に割り当てられる.
チェツクコード(18桁目)
1.十七桁数字本体コード重み付け加算式
S= SUM(Ai * Wi), i=0, ... , 16,まず上位17桁の数字の重みを求める.
Ai:i番目の位置を示す身分証明書番号の数値
Wi:i番目の位置の重み係数を示す
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.計算モジュール
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 2
認証方法:
<?php
function checkIdCard($idcard){
// 18
if(strlen($idcard)!=18){
return false;
}
//
$idcard_base = substr($idcard, 0, 17);
//
$verify_code = substr($idcard, 17, 1);
//
$factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
//
$verify_code_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
// 17
$total = 0;
for($i=0; $i<17; $i++){
$total += substr($idcard_base, $i, 1)*$factor[$i];
}
//
$mod = $total % 11;
//
if($verify_code == $verify_code_list[$mod]){
return true;
}else{
return false;
}
}
$idcard = ' ';
var_dump(checkIdCard($idcard));
?>