恐怖,原来真的可以通过身份证后12位推测你的地址信息
今天,被一个大神根据我部分身份证信息推出了我大致的地址信息,吓了一大跳,赶紧百度身份证相关知识,大致明白了他是怎么做的。估计是通过身份证最后一位校验位推的,赶紧先下了个身份证前6位地址编码数据库,然后根据自己的思路,写了个根据后12位身份证信息推测地址的c代码,一运行,还真能得到想要的结果,就是结果多了点。现将相关代码和身份证地址编码表一并提供给各位参考,望不吝赐教!
程序代码:
#include <stdio.h> int idtest(char *p) {//验证身份证,合格返回1,不合格返回0 int i,s,a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char m,n,b[]="10X98765432"; for(i=0;p[i];i++); if(i!=18)return 0; //只验证18位身份证 m=p[17]; if(m=='x')m='X'; for(i=s=0;p[i+1];i++)s+=(p[i]-'0')*a[i]; n=b[s%11]; return m==n; } void main() {//身份证前6位地址编码推测,稍加修改可以根据已知条件推测省、市、区、年龄、性别,已知条件越多,推测越准确 FILE *fp; char id[19],bm[10],addr[100]; int i; printf("请输入身份证后12位:"); scanf("%s",id); for(i=19;i>5;i--)id[i]=id[i-6]; //向后移动6位,空出地址编码 if(fp=fopen("idinfo.txt","rt")) //打开地址编码文件,地址编码里的数据好像不全 { while(fscanf(fp,"%s%s",bm,addr)!=EOF) { for(i=0;i<6;i++)id[i]=bm[i]; //复制地址编码拼凑18位完整身份证信息 if(idtest(id))printf("%s---%s\n",id,addr); //校验身份信息,如果校验合格则输出该身份证所在地址信息 } fclose(fp); } }
身份证前6位地址编码信息表(idinfo.txt):
idinfo.zip
(25.36 KB)