19位银行卡卡号有效性合法性验证

根据《中国银联2.0》标准 - Q/CUP 002-2004 提供的算法

Luhn计算模10“隔位2倍加”校验数的公式

计算步骤如下:

步骤1:从右边第1个数字(低序)开始每隔一位乘以 2 。

步骤2:把在步骤1中获得的乘积的各位数字与原号码中未乘2的各位数字相加。

步骤3:从邻近的较高的一个以0结尾的数中减去步骤2中所得到的总和

[这相当于求这个总和的低位数字(个位数)的“ 10的补数 ”],

如果在步骤2得到的总和是以零结尾的数(如30、40等等),则校验数字就是零。

[例]:

无校验数的卡号655002 0001 00000328 步骤

6 5 5 0 0 2 0 0 0 1 0 0 0 0 0 3 2 8 1

x2 x2 x2 x2 x2 x2 x2 x2 x2

10 0 4 0 2 0 0 6 16

6 + 1 + 0 + 5 + 0 + 0 + 4 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 6 + 2 + 1 + 6 = 33 2

40 – 33 = 7 3

即校验为 7

带有校验数的卡号为:655002 0001 00000328 7

(银联要求的卡号是13-19位,此程序暂时满足19位卡号的计算,19位以下的有待修改)

功能:检查19位的银行卡号码的有效性

运行环境:Red Hat Enterprise Linux AS release 3 、AIX Version 5 操作系统上测试通过

编译命令:cc -o card card.c

执行命令:./card

源代码:

/************************************************************

FileName: card.c

Author: yuanfen127

Date: 2005年12月01日

Description: 银行卡号码的有效性检查程序

Version: 1.0

Function List:

1. int CreatBit(char *cdno, int length) 根据前面length-1位长度生成最后校验位

2. int iCheckBit(char *sbuf) 调用CreateBit生成校验位和输入的比较 History:

***********************************************************/

#include

#include

main()

{

char card_no[20];

printf("请输入19位卡号:");

scanf("%19s",card_no);

printf("卡号:%s\n",card_no);

/*CreatBit(card_no,strlen(card_no)-1);*/

if ( strlen(card_no)

{

printf("卡号长度错误\n");

return -1;

}

if ( 0 != iCheckBit(card_no) )

{

printf("卡号错误!\n");

}

else

{

printf("卡号正确!\n");

}

}

int CreatBit(char *cdno, int length)

{

int CI[18]={1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2};

int i,d,result;

int chk_dig=0;

if ( strlen(cdno)

{

printf("输入的长度错,长度=%d\n",strlen(cdno));

return -1;

}

for ( i=0; i

{

d = cdno[i]-48;

result = d * CI[i];

chk_dig += result/10 + result%10;

}

chk_dig = 10 - chk_dig%10;

chk_dig = (chk_dig==10) ? 0 : chk_dig;

cdno[length] = chk_dig + 48;

printf("检验位:%d\n",chk_dig);

return 0;

}

int iCheckBit(char *sbuf)

{

char cardbuf[19];

int l_len;

memcpy( cardbuf, sbuf, 19 );

l_len = strlen(sbuf);

l_len = l_len > 19 ? 19 : l_len ;

if( (CreatBit(cardbuf, l_len - 1 ) != 0) || memcmp(sbuf, cardbuf, l_len)) {

return(-1);

}

return(0);

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuanfen127/archive/2005/12/24/560716.aspx

根据《中国银联2.0》标准 - Q/CUP 002-2004 提供的算法

Luhn计算模10“隔位2倍加”校验数的公式

计算步骤如下:

步骤1:从右边第1个数字(低序)开始每隔一位乘以 2 。

步骤2:把在步骤1中获得的乘积的各位数字与原号码中未乘2的各位数字相加。

步骤3:从邻近的较高的一个以0结尾的数中减去步骤2中所得到的总和

[这相当于求这个总和的低位数字(个位数)的“ 10的补数 ”],

如果在步骤2得到的总和是以零结尾的数(如30、40等等),则校验数字就是零。

[例]:

无校验数的卡号655002 0001 00000328 步骤

6 5 5 0 0 2 0 0 0 1 0 0 0 0 0 3 2 8 1

x2 x2 x2 x2 x2 x2 x2 x2 x2

10 0 4 0 2 0 0 6 16

6 + 1 + 0 + 5 + 0 + 0 + 4 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 6 + 2 + 1 + 6 = 33 2

40 – 33 = 7 3

即校验为 7

带有校验数的卡号为:655002 0001 00000328 7

(银联要求的卡号是13-19位,此程序暂时满足19位卡号的计算,19位以下的有待修改)

功能:检查19位的银行卡号码的有效性

运行环境:Red Hat Enterprise Linux AS release 3 、AIX Version 5 操作系统上测试通过

编译命令:cc -o card card.c

执行命令:./card

源代码:

/************************************************************

FileName: card.c

Author: yuanfen127

Date: 2005年12月01日

Description: 银行卡号码的有效性检查程序

Version: 1.0

Function List:

1. int CreatBit(char *cdno, int length) 根据前面length-1位长度生成最后校验位

2. int iCheckBit(char *sbuf) 调用CreateBit生成校验位和输入的比较 History:

***********************************************************/

#include

#include

main()

{

char card_no[20];

printf("请输入19位卡号:");

scanf("%19s",card_no);

printf("卡号:%s\n",card_no);

/*CreatBit(card_no,strlen(card_no)-1);*/

if ( strlen(card_no)

{

printf("卡号长度错误\n");

return -1;

}

if ( 0 != iCheckBit(card_no) )

{

printf("卡号错误!\n");

}

else

{

printf("卡号正确!\n");

}

}

int CreatBit(char *cdno, int length)

{

int CI[18]={1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2};

int i,d,result;

int chk_dig=0;

if ( strlen(cdno)

{

printf("输入的长度错,长度=%d\n",strlen(cdno));

return -1;

}

for ( i=0; i

{

d = cdno[i]-48;

result = d * CI[i];

chk_dig += result/10 + result%10;

}

chk_dig = 10 - chk_dig%10;

chk_dig = (chk_dig==10) ? 0 : chk_dig;

cdno[length] = chk_dig + 48;

printf("检验位:%d\n",chk_dig);

return 0;

}

int iCheckBit(char *sbuf)

{

char cardbuf[19];

int l_len;

memcpy( cardbuf, sbuf, 19 );

l_len = strlen(sbuf);

l_len = l_len > 19 ? 19 : l_len ;

if( (CreatBit(cardbuf, l_len - 1 ) != 0) || memcmp(sbuf, cardbuf, l_len)) {

return(-1);

}

return(0);

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuanfen127/archive/2005/12/24/560716.aspx


相关文章

  • 支付机构网络支付业务管理办法(征求意见稿)
  • 支付机构网络支付业务管理办法(征求意见稿) 第一章总则 第一条为规范支付机构网络支付业务,防范支付风险,保护当事人合法权益,根据<中华人民共和国中国人民银行法>.<非金融机构支付服务管理办法>等规定,制定本办法. 第 ...查看


  • 商业银行信用卡业务监督管理办法
  • 商业银行信用卡业务监督管理办法 第一章 总则 第一条 为规范商业银行信用卡业务,保障客户及银行的合法权益,促进信用卡业务健康有序发展,根据<中华人民共和国银行业监督管理法>.<中华人民共和国商业银行法>.<中华 ...查看


  • 医院门禁系统设计方案
  • XXX医院综合楼弱电及系统集成工程项目 一卡通系统设计方案 目 录 1 项目概述 .................................................. 3 2 系统概述 ................... ...查看


  • 电子支付工具应用现状及存在的问题分析报告
  • 电子支付工具应用现状及存在的问题分析报告 一.电子支付工具概述 1.电子支付工具种类 电子支付即货币支付工具的电子化.指在电子交易过程中,以网络连接为基础, 数字化为特征,可实现电子交易实时支付功能 金融支付工具. 随着计算机技术的发展,电 ...查看


  • 银行卡创新产品支付介绍
  • 银行卡创新产品支付介绍 一. 银行IC卡的分类... 1 二. 银行IC卡产品及规范... 2 三. 国内互联网支付发展与特点... 6 四. 银联互联网支付产品... 9 五. 国外移动支付的发展... 21 六. 国内移动支付的发展及特 ...查看


  • 移动公司计费账务管理系统
  • 目 录 移动公司计费账务管理系统 ....................................................................................................... ...查看


  • 四大新型网络诈骗
  • 央视揭秘四大新型网络诈骗手段 真假网店引关注 作者: 时间:2014-04-30 [畅游网络要小心,诈骗手段在不断翻新,真假网店难以分辨,购物不慎就会被骗.专家支招网购:擦亮双眼,眼见不一定是事实.]网络诈骗案件日益增多,并且花样百出,令人 ...查看


  • 十项措施创新管理和技术
  • 十项措施创新管理和技术,防范ATM 犯罪保安全 导读: 近年来,针对ATM 的各种犯罪行为日益猖獗,犯案手段花样翻新,层出不穷,直接危害到ATM 的营运安全和社会金融秩序.2010年7月,北京闹市区竟然出现山寨版ATM ,以读卡器等设备套取 ...查看


  • 公安部:谨防电信网络诈骗,提高老年人防骗意识!
  • 62岁的张阿姨收到一条"某银行"的短信,称其银行的电子密码器将于近期失效,要尽快登录指定的网站进行升级.张阿姨为避免造成不便,就点击登录了短信内的链接,并按照要求输入了个人身份信息,和银行卡账号信息,就在张阿姨点击确定后 ...查看


热门内容