审计中身份证校验码检验的ASL实现
龚勇 邹玮(湖北省十堰市审计局)
【发布时间:2011年11月28日】
字号:【大】 【中】 【小】


身份证是每个中国公民的身份凭证,记载着姓名、性别、地址、出生年月、民族、发证机关、发证时间、身份证号等等信息。居民在入学、就业、办理个人信贷事务、参加社会保险、领取社会救济时都需要出示并登记身份证信息。因此,身份证信息在审计过程扮演了越来越重要的角色。例如,在就业专项资金审计中,业务台帐中一个十分重要的信息就是领取补贴人员的身份证号码,通过验证身份证号码的真实性和合规性,可以从中发现审计线索。本文使用ASL语言在AO中实现了对第18位校验码的自动检验。
根据【中华人民共和国国家标准 GB 11643-1999】中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。校验码(身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码,其具体计算方法为:
(1)将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
(2)将这17位数字和系数相乘的结果相加。
(3)用加出来和除以11,得到余数。余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字。其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。例如:通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先,我们得出前17位的乘积和是189。
然后,用189除以11得出的结果是17 + 2/11,也就是说余数是2。
最后,通过对应规则知道余数2对应的数字是x。所以,这是一个合格的身份证号码。
根据以上步骤,我们在某就业专项资金审计过程中尝试用ASL语言编写了身份证校验码检验的自动审计方法,具体ASL语言如下:
var sql,eof,count,name,sum,IDCard,i,temp1,temp2,w,CRC;
begin
    count:=0;
    //计数器清零
    sql:=createq('select * from [就业台帐] where (len([身份证号])=18)',-1);
    //从业务数据表[就业台帐]中,查找出所有18位身份证号码(区别于老式的15位身份证号码,15位身份证号码没有校验位)
    eof:=qeof(sql);
    if eof<>1 then
    begin
      repeat
        IDCard:=QFDValue(sql,'身份证号');
        name:=QFDValue(sql,'姓名');
  sum:=0;//
    w:='79X584216379X5842';//18位身份证号每一位对应的权值
  CRC:='Y0X987654321';
  begin
    i:=18;
    repeat
     temp1:=MidStr(IDCard,19-i,1);
     temp2:=MidStr(w,19-i,1);
     if temp2='X' then temp2:=10;
     temp1:=temp1*temp2;
     sum:=sum+temp1;
     i:=i-1;
    until i=1;
  end;
  while sum>=11 do sum:=sum-11;//取加权和对11的余数
        if MidStr(IDCard,18, 1)<>MidStr(CRC,sum+1, 1) then
         begin
           count:=count+1;
           write(count,' ',name,' ',IDCard);
           AddTransDout(sql,'校验码不符');//保存疑点
         end;
        eof:=qmov(sql,1);
        eof:=qeof(sql);
      until eof=1;
    end;
TransBatch(sql,'出生年月与身份证不符');//输出疑点
end.
以以下数据为例:
 
运行结果如下:

 
相应的疑点数据也已被保存为业务数据疑点,如下图:


 
 

【关闭】    【打印】