前言

随着网络的发展,现在人手一部手机,大家别误会啊,我不是在定位女友了(前文回顾点我),我只是感慨一下网路的发展快。昨天回了一次老家,在车上无聊看着火车票,虽然火车票上的身份证打了四个星号,但是是否意味着安全啦?

通过百度简单的搜索一下

点击我百度火车票搜索

详细分析

1.寻找数据源

我们随便选择一个

就这位了

2.四位星号分析

现在我们来分析一下这四位星号,从身份证的构造上看 肯定是 月日,二个字节表示月或者日,假如四个星号为(ABCD)

那么A 代表的是月 大家都知道月最多是12月 那么A 最大是1,

那么只有二种选择(0,1),

好现在我们开始判断一下B的取值范围:

当A为0的时候B取值为(1-9)

当A为1的时候B取值为(0-2)

现在来判断C的范围,大家都知道一个月最多31天,

那么C的范围(0-3)

现在判断一下D的范围

当C为0的时候D为1-9

当C为1-2的时候D为0-9

当C为3的时候D为0-1

大家别嫌弃我分析麻烦,如果不分析,怎么写代码?

3.写代码生成数据

//月左位
for (size_t iA = 0; iA < 2; iA++) { //月右位 for (size_t iB = 0; iB < 10; iB++) { //当A为0的时候B取值为(1 - 9) if (iA==0) { if (iB==0) { continue; } } else if (iA == 1) //当A为1的时候B取值为(0-2) { if (iB > 2) { continue; } } //日的左边 for (size_t iC = 0; iC < 4; iC++) { //日的右边 for (size_t iD = 0; iD < 10; iD++) { //当C为0的时候D为1-9 if (iC==0) { if (iD == 0) { continue; } } else if (iC == 3)//当C为3的时候D为0 - 1 { if (iD > 1) { continue; } } sprintf(buffer, "%s%d%d%d%d%s", pFrist,iA, iB, iC, iD, pEnd); if (!Chk18PaperId(buffer)) { WriteFile(hFile, buffer, strlen(buffer), &dwWrite, NULL); WriteFile(hFile, "\r\n", 2, &dwWrite, NULL); } } } } } 

4.数据进行过滤

根据月大月小过滤一下数据,1.3.5.7.8.10.12 是月大 2月只有28天

//开始遍历 //1 3 5 7 8 10 12 月大
//进行月大月小的判断if (iA==0)
{
if (iB == 4 || iB == 6 || iB == 9 || iB == 11) { //月小 if (iC == 3 && iD == 1) { continue; } } else if (iB==2) { //月小 if (iC > 2) { continue; } else if (iC==2&&(iD>8)) { continue; } } } else { if (iB==1) { //11月是月小 if (iC==3&&iD==1) { continue; } } }

少了几条啊

5.数据再次过滤

一共有三百多条数据,我们需要进一步进行过滤,过滤原理如下

校验规则是:

(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 3 2

int Chk18PaperId(const char *sPaperId) { long lSumQT = 0; //加权因子   int R[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; //校验码   char sChecker[11] = { '1','0','X', '9', '8', '7', '6', '5', '4', '3', '2' }; //检验长度   if (18 != strlen(sPaperId)) return -1; //校验数字   for (int i = 0; i<18; i++) { if (!isdigit(sPaperId[i]) && !(('X' == sPaperId[i] || 'x' == sPaperId[i]) && 17 == i)) { return -1; } } //验证最末的校验码   for (int i = 0; i <= 16; i++) { lSumQT += (sPaperId[i] - 48) * R[i]; } if (sChecker[lSumQT % 11] != sPaperId[17]) { return -1; } return 0; }

看计算后的结果

这个结果还是比较满意的,只有三十多次了

6.数据验证

最后一步,数据验证

根据姓名和上传生成的30多个身份证id取验证一下吧

我随机选择了家的,代码如下 大同小异,关于最后身份证号码是多少?我在此保密,自己验证

验证测试代码

#include<Windows.h>
#include<stdio.h> /*************************************************** * 函 数 名: Chk18PaperId * * 函数功能: 校验18位身份证号码 * * 输入参数:  sPaperId  身份证号 * * 输出参数: * * 返回值:   0        成功 *           其他     失败 ****************************************************/ int Chk18PaperId(const char *sPaperId) { long lSumQT = 0; //加权因子   int R[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; //校验码   char sChecker[11] = { '1','0','X', '9', '8', '7', '6', '5', '4', '3', '2' }; //检验长度   if (18 != strlen(sPaperId)) return -1; //校验数字   for (int i = 0; i<18; i++) { if (!isdigit(sPaperId[i]) && !(('X' == sPaperId[i] || 'x' == sPaperId[i]) && 17 == i)) { return -1; } } //验证最末的校验码   for (int i = 0; i <= 16; i++) { lSumQT += (sPaperId[i] - 48) * R[i]; } if (sChecker[lSumQT % 11] != sPaperId[17]) { return -1; } return 0; } void CreateId(char * pFrist, char * pEnd) { char buffer[MAX_PATH] = { 0 }; DWORD dwWrite = 0; HANDLE hFile = CreateFileA("1.txt",  FILE_WRITE_ACCESS, NULL,  NULL, OPEN_ALWAYS, NULL, NULL); //月左位 for (size_t iA = 0; iA < 2; iA++) { //月右位 for (size_t iB = 0; iB < 10; iB++) { //当A为0的时候B取值为(1 - 9) if (iA==0) { if (iB==0) { continue; } } else if (iA == 1) //当A为1的时候B取值为(0-2) { if (iB > 2) { continue; } } //日的左边 for (size_t iC = 0; iC < 4; iC++) { //日的右边 for (size_t iD = 0; iD < 10; iD++) { //当C为0的时候D为1-9 if (iC==0) { if (iD == 0) { continue; } } else if (iC == 3)//当C为3的时候D为0 - 1 { if (iD > 1) { continue; } } //开始遍历 //1 3 5 7 8 10 12 月大 //进行月大月小的判断 if (iA==0) { if (iB == 4 || iB == 6 || iB == 9 || iB == 11) { //月小 if (iC == 3 && iD == 1) { continue; } } else if (iB==2) { //月小 if (iC > 2) { continue; } else if (iC==2&&(iD>8)) { continue; } } } else { if (iB==1) { //11月是月小 if (iC==3&&iD==1) { continue; } } } sprintf(buffer, "%s%d%d%d%d%s", pFrist,iA, iB, iC, iD, pEnd); if (!Chk18PaperId(buffer)) { WriteFile(hFile, buffer, strlen(buffer), &dwWrite, NULL); WriteFile(hFile, "\r\n", 2, &dwWrite, NULL); } } } } } CloseHandle(hFile); } void main() { CreateId("2113241992", "3014"); }

最后总结

希望大家注意火车票的隐私,千万别乱丢火车票,同时提醒12306给校验码去掉,这样就增加了难度

火车票上的星号暗藏玄机?!相关推荐

  1. CSS3中:nth-child和:nth-of-type的区别深入理解。 关于:nth-child和:nth-of-type的区别之前一直没太注意,经深入理解才发现里面其实暗藏玄机...

    关于:nth-child和:nth-of-type的区别之前一直没太注意.最近打算深入了解一些CSS3,才发现里面其实暗藏玄机. :nth-child可以选择父元素下的字元素,:nth-of-type ...

  2. C++ 在屏幕上用星号打印菱形

    粉丝提问:C++ 在屏幕上用星号打印菱形 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void pr_start(int ...

  3. 手机上的星号键和井号键有什么用?

    手机上的星号键和井号键一般都有什么用?今天可算是涨见识了. 我们平时打电话拨号的时候,会发现手机上的星号键和井号键通常会被闲置.那么,手机上的星号键和井号键有什么用? 首先,我们可以通过电话发展的历史 ...

  4. 非常带感的武汉周边一日游行政主管提示你这封作品暗藏玄机

    每个人的人生不可能总会一帆风顺,工作,学习生活多余应该要多出去走走才是,生活中是如此,说走就走的旅行亦是如此,身体和灵魂总有一个出发在路上,田园般的恬静生活很多人都很向往哦.非常带感的武汉周边一日游行 ...

  5. 小米MIX 4无线反向充电安排上了?MIUI测试版固件中暗藏玄机

    无线充电技术目前已在不少旗舰机上得到运用,并且相应的快充技术也日渐成熟,而无线反向充电技术还运用得较少,目前仅在三星Galaxy S10.华为Mate 20 Pro等少数机型上有所运用.现在有最新消息 ...

  6. MySQL的COUNT语句暗藏玄机

    前言: 关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会被虐.不信 ...

  7. 铁路售票系统_黑龙江一学生购买的火车票上惊现“学猪”字样!铁路部门给出回应...

    11月23日,黑龙江鹤岗一高校学生在取票时发现,自己购买的学生票在票种一栏竟显示"学彘"字样,而且购买的两张票上都这样显示,该学生觉得不太好,于是便向铁路部门讨要说法. 按照常理来 ...

  8. Windows7正式版默认壁纸暗藏玄机!

    Windows7测试版壁纸中内含的彩蛋想必各位朋友们再熟悉不过了,但现在,正在使用Windows7正式版的朋友们,你们可知道自己天天面对的普通的壁纸其实也并不普通呢? 上面的背景图片看起来是很简单,但 ...

  9. “秤”心不如务“时”,Libra合规路暗藏玄机

    来源 | 成都链安 责编 | 晋兆雨 头图 | 付费下载于视觉中国 最近,全世界最大的社交网站美国Facebook主导发起的虚拟货币Libra(天秤币)发行一事,在沉寂许久后出现了新的转机.不过,在L ...

最新文章

  1. javascript中错误使用var造成undefined
  2. mysql lisensce_Linux之lldptool命令
  3. BJUI选择时间后点击导出提示未选择时间
  4. linux curl 多线程,CURL多线程不执行一直在请求
  5. eclipseini设置使用的jdk_系统安全篇(四)-如何升级JDK版本?
  6. 利用CMD在vim中直接编译
  7. 允许活动内容在我的计算机上,然后就看到选项允许活动内容在我的计算机上的文件中运行...
  8. 提高代码的运行效率 (4)
  9. UIScrollView总结
  10. 提交表单上传照片预览
  11. Protobuf 判断某个值是否在一个枚举值中
  12. 宝塔下php安装mongodb扩展_PHP安装MongoDB扩展
  13. 海思接收bt1120外同步视频流
  14. 用户手册(User Manual)书写规范
  15. html5演讲ppt,制作ppt太麻烦?用上这5款黑科技PPT模板,汇报、演讲瞬间高大上
  16. 物联网毕业设计 车牌识别系统 stm32
  17. 护理管理学复习题及参考答案
  18. win10自带图片出现文件系统错误 (-2147219196)的修复方法
  19. 什么是大数据?2022大数据时代
  20. 小程序 6位数密码输入

热门文章

  1. WorkFlow入门Step.4—Adding Procedural Elements-For-WF4.0-(续)
  2. go语言培训班多少钱
  3. 事件ID 6038审核NTLM使用情况
  4. 在docker中使用MySQL数据库
  5. BIM技术在各阶段应用的软件你知多少?
  6. 微软发布Azure Application Insights for Node.js 1.0版本
  7. 6.11 将分割数据转换为多值IN列表
  8. 会计的思考(41):会计的领悟—每一位业务骨干都是优秀的管理会计师
  9. java·环境变量、基本数据类型
  10. Angularjs 中select回显后重复选项的解决