新底层密钥体系详解412分析解析.docx
《新底层密钥体系详解412分析解析.docx》由会员分享,可在线阅读,更多相关《新底层密钥体系详解412分析解析.docx(17页珍藏版)》请在冰豆网上搜索。
新底层密钥体系详解412分析解析
1使用流程
以下写的都是针对新底层安全库部分的用法
2使用注意事项
a.每次开机进入应用程序一定要做密码键盘初始化,初始化过程实现自动检测密码键盘类型和密码键盘bps。
b.第一次装载密钥建议初始化密钥区,如果是825-6初始化时间大约30秒左右
c.为显示上兼容,在密码键盘上显示时一行内容不要超过15个字节,显示完后请调用PubClrPinPad函数恢复默认显示。
d.由于zt579e18不支持显示汉字,zt579c47显示汉字方式和nl系列密码键盘不同,建议在程序中不要显示汉字,都用英文显示,否则程序要增加判断密码键盘类型。
e.nl825-6密码键盘支持0-167组密钥,由于考虑到x993des算法的兼容,在每装载一组密钥时库里面自动多装载一次,因此实际的密码组数是0~73,因新的密钥体系外接密码键盘部分支持Pin、Mac、Track、Data四组密钥,所以实际密码组数是0-36。
f.在调用PubGetPin取密码时,如果按确认键返回表示无密码,此时可以通过第一个输出参数pszPin是否有内容来判断是否有密码。
g.在中行IST版程序中如果是3DES密钥,由于主密钥不能参加MAC运算,因此需要将主密钥当作工作密钥再保存一次。
3接口说明
3.1PubInitSecrity
函数名称:
intPubInitSecrity(intnMode,constSTPINPADPARAM*pstPinpadParam);
函数介绍:
初始化安全库
函数描述:
完成密码键盘自适应、设置波特率、密码键盘类型的初始化工作,指定初始化内置还是外接密码键盘。
入口参数:
nMode详见:
EM_SECRITY_MODE
STPINPADPARAM:
密码键盘参数
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.2PubSetCurrentMainKeyIndex
函数名称:
intPubSetCurrentMainKeyIndex(intnIndex)
函数介绍:
设置当前主密钥索引号
函数描述:
无
入口参数:
nIndex索引号
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.3PubLoadMainKey
函数名称:
intPubLoadMainKey(intnIndex,constchar*psKey,intnKeyLen)
函数介绍:
安装主密钥
函数描述:
无
入口参数:
nIndex索引号
psKey主密钥明文(BCD码)
nKeyLen主密钥长度8字节或16字节
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.4PubLoadWorkKey
函数名称:
intPubLoadWorkKey(intnKeyType,constchar*psKey,intnKeyLen,constchar*psCheckValue)
函数介绍:
安装工作密钥
函数描述:
无
入口参数:
nKeyType安装的工作密钥类型(详见:
EM_KEY_TYPE)
psKey工作密钥密文(BCD码)
nKeyLen工作密钥长度8字节或16字节
出口参数:
psCheckValue校验值
返回值:
APP_SUCC成功
其它失败
3.5PubGetPin
函数名称:
intPubGetPin(char*pszPin,int*pnPinLen,intnMode,constchar*pszCardno,constchar*pszAmount,intnMaxLen,intnMinLen);
函数介绍:
获取Pin
函数描述:
支持多种加密算法。
实现密码最大最小长度的设置,显示无密码时,按确认键。
密码输入提示在第二行、输入时以星号显示,密码输完,清除屏幕到默认状态;
入口参数:
nMode密码加密模式(详见:
EM_PIN_TYPE)
pszCardno卡号
pszAmount金额
nMaxLen最大的密码长度
nMinLen最小的密码长度
出口参数:
pszPin输入的Pin
pnPinLen输入Pin的长度
返回值:
APP_SUCC成功
其它失败
3.6PubGetPinExtern
函数名称:
intPubGetPinExtern(char*pszPin,int*pnPinLen,intnMode,constchar*pszCardno,intnMaxLen,intnMinLen,void(*ShowFunc)());
函数介绍:
获取Pin
函数描述:
支持自定义POS界面显示函数
入口参数:
nMode密码加密模式(详见:
EM_PIN_TYPE)
pszCardno卡号
nMaxLen最大的密码长度
nMinLen最小的密码长度
ShowFunc显示函数
出口参数:
pszPin输入的Pin
pnPinLen输入Pin的长度
返回值:
APP_SUCC成功
其它失败
3.7PubCalcMac
函数名称:
intPubCalcMac(intnMode,constchar*psData,intnDataLen,char*psMac);
函数介绍:
获取Mac
函数描述:
无
入口参数:
nMode计算Mac算法类型(详见:
EM_MAC_TYPE)
psData计算Mac的数据
nDataLen数据长度
出口参数:
psMacMac值
返回值:
APP_SUCC成功
其它失败
3.8PubActiveKey
函数名称:
intPubActiveKey(intnMode,intnIndex,intnActiveKeyType);
函数介绍:
激活工作密钥
函数描述:
算mac及输入密码函数前需先调用此操作
入口参数:
nMode激活模式(DESMODE_DES、DESMODE_3DES)
nIndex索引号
nActiveKeyType激活的类型(0--KEY_TYPE_PIN/1--KEY_TYPE_MAC/2--KEY_TYPE_TRACK)
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.9PubClearKey
函数名称:
intPubClearKey(void);
函数介绍:
清空密钥区
函数描述:
无
入口参数:
无
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.10PubDispPinPad
函数名称:
intPubDispPinPad(intnLine,constchar*pszData);
函数介绍:
在密码键盘上显示数据
函数描述:
无
入口参数:
nLine指定的行1,2
pszData待显示的字符串
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.11PubClrPinPad
函数名称:
intPubClrPinPad(void);
函数介绍:
密码键盘恢复默认显示界面
函数描述:
无
入口参数:
无
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.12PubDispDot
函数名称:
intPubDispDot(intnLine,constchar*pszDotData,intnDataLen);
函数介绍:
在密码键盘液晶屏的指定行,显示中文字符串
函数描述:
无
入口参数:
nLine指定的行数1,2
pszDotData待显示的数据
nDataLen待显示的数据长度
出口参数:
无
返回值:
APP_SUCC成功
其它失败
3.13PubGetSecrityVerion
函数名称:
voidPubGetSecrityVerion(char*pszVer);
函数介绍:
获取安全模块版本
函数描述:
注意pszVer空间不能小于12个
入口参数:
无
出口参数:
pszVer12字节版本号
返回值:
APP_SUCC成功
其它失败
3.14PubDes
函数名称:
intPubDes(intnKeyType,constchar*psSrc,char*psDest);
函数介绍:
Des加密数据
函数描述:
无
入口参数:
nKeyType密钥类型(详见:
EM_KEY_TYPE)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
3.15PubUnDes
函数名称:
intPubUnDes(intnKeyType,constchar*psSrc,char*psDest);
函数介绍:
Des解密数据
函数描述:
无
入口参数:
nKeyType密钥类型(详见:
EM_KEY_TYPE)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
3.16PubDes3
函数名称:
intPubDes3(intnKeyType,constchar*psSrc,char*psDest);
函数介绍:
3Des加密数据
函数描述:
无
入口参数:
nKeyType密钥类型(详见:
EM_KEY_TYPE)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
3.17PubUnDes3
函数名称:
intPubUnDes3(intnKeyType,constchar*psSrc,char*psDest);
函数介绍:
3Des解密数据
函数描述:
无
入口参数:
nKeyType密钥类型(详见:
EM_KEY_TYPE)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
3.18PubSoftDes
函数名称:
intPubSoftDes(constchar*psKey,constchar*psSrc,char*psDest);
函数介绍:
Des软加密
函数描述:
无
入口参数:
psKey明文密钥(8字节BCD码)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
3.19PubSoftUnDes
函数名称:
intPubSoftUnDes(constchar*psKey,constchar*psSrc,char*psDest);
函数介绍:
Des软解密
函数描述:
无
入口参数:
psKey明文密钥(8字节BCD码)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
3.20PubSoftDes3
函数名称:
intPubSoftDes3(constchar*psKey,constchar*psSrc,char*psDest);
函数介绍:
3Des软加密
函数描述:
无
入口参数:
psKey明文密钥(16字节BCD码)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
3.21PubSoftUnDes3
函数名称:
intPubSoftUnDes3(constchar*psKey,constchar*psSrc,char*psDest);
函数介绍:
3Des软解密
函数描述:
无
入口参数:
psKey明文密钥(16字节BCD码)
psSrc数据(8字节BCD码)
出口参数:
psDest密文(8字节BCD码)
返回值:
APP_SUCC成功
其它失败
4接口测试用例(举例)
4.1初始化密码键盘
sPinPadMode=SECRITY_MODE_INSIDE;
STPINPADPARAMstPinpadParam=
{
PORT_NUM_COM2,
60,
0x00,
0x01,
0x01,
0x04,
""/**<仅对证通的密码键盘有用*/
"",
PINPAD_HY,/**1,
0,
0,
1,
""
};
nRes=PubInitSecrity(sPinPadMode,&stPinpadParam);
if(nRes!
=APP_SUCC)
{
PubMsgDlg("InitSecrityerror",NULL,0,0);
return-1;
}
else
{
PubMsgDlg("InitSecritySUCC",NULL,0,0);
}
4.2安装主密钥
nRet=PubLoadMainKey(nKeyIndex,szBcdMainKey,nLen);
if(nRet!
=APP_SUCC)
{
PubDispErr("安装密钥失败");
returnAPP_FAIL;
}
SetVarMainKeyNo(nKeyIndex);
4.3安装工作密钥
GetVarMainKeyNo(&nMainKeyNo);
PubSetCurrentMainKeyIndex(nMainKeyNo);
nRet=PubLoadWorkKey(KEY_TYPE_PIN,tpke,nKeyLen,tpkcv);
if(nRet!
=APP_SUCC)
{
PubMsgDlg(pszTitle,"PIN密钥下装失败",3,10);
returnAPP_FAIL;
}
4.4取Pin
GetVarMainKeyNo(&nMainKeyNo);
PubSetCurrentMainKeyIndex(nMainKeyNo);
nRet=PubActiveKey(DESMODE_3DES==GetVarEncyptMode()?
DESMODE_3DES:
DESMODE_DES,nMainKeyNo,KEY_TYPE_PIN);
if(nRet!
=APP_SUCC)
{
PubMsgDlg("输入密码","密码键盘激活失败,请重新签到",3,10);
returnAPP_FAIL;
}
nRet=PubGetPin(pszPin,&nPinLen,nMode,pszPan,pszAmount,PIN_MAX_LEN,PIN_MIN_LEN);
if(nRet!
=APP_SUCC)
{
if(YES==GetVarIsPinpad())
PubClrPinPad();
if(nRet==APP_QUIT)
{
returnAPP_QUIT;
}
//调用密码错误信息
PubDispErr("输入密码");
returnAPP_FAIL;
}
4.5取Mac
GetVarMainKeyNo(&nMainKeyNo);
PubSetCurrentMainKeyIndex(nMainKeyNo);
nRet=PubActiveKey(DESMODE_3DES==GetVarEncyptMode()?
DESMODE_3DES:
DESMODE_DES,nMainKeyNo,KEY_TYPE_MAC);
if(nRet!
=APP_SUCC)
{
PubMsgDlg("输入密码","密码键盘激活失败,请重新签到",3,10);
returnAPP_FAIL;
}
nRet=PubCalcMac(MAC_TYPE_ECB,psData,*pnDataLen,psData+(*pnDataLen));
if(nRet!
=APP_SUCC)
{
returnnRet;
}
4.6硬加密PubDes、PubUnDes、PubDes3、PubUnDes3
nRet=PubDes3(KEY_TYPE_TRACK,szTrackBlock,szTrackBlock_Enc);
if(nRet!
=APP_SUCC)
{
PubMsgDlg(NULL,"磁道加密失败",3,30);
returnAPP_FAIL;
}
4.7软加密PubSoftDes、PubSoftUnDes、PubSoftDes3、PubSoftUnDes3
PubSoftDes(szBcdMainKey,szBcdMainKey,szMainKey)
5移植相关(重要)
新密钥体系的安全库推出的用意旨在提高开发效率,降低应用的难度,新安全库跟旧的密码键盘库的区别,及新安全库的特点有以下几点:
1、新安全库支持外接和内置的用法,看到一些早期的应用程序内置的写法不统一,跟不同开发人员的风格就有一套自己的内置写法,有的甚至把工作密钥保存在文件中,或者以明文方式加载工作密钥,这是绝对不允许的;新安全库提供了内置和外接统一的接口,可直接调用使用。
2、对#ifdef、#endif彻底说NO,我讨厌各种标志;
早期的应用程序里面看到最多的
#ifdef(SUPPORT_PINPAD)
。
。
。
else
#endif
。
。
。
现在不用这么写了,直接调用安装如上4.2、4.3的接口测试用例,只是要注意的是PubSetCurrentMainKeyIndex(nMainKeyNo)的索引要设置对,这个索引在安装完主密钥后要保存起来,在使用的时候在取出来设置这个索引;
3、安装主密钥的时候不用在清空对应索引的密钥了,直接调用;如需要清空全部的密钥区调用PubClearKey;
4、需要注意的是移植早期的应用程序在系统管理员操作设置内置还是外接密码键盘的的时候,要调用一下PubInitSecrity初始化,是内置还是外接是通过这个函数初始化传入的。
当然在有的情况下如果不知道该用内置还是外接的时候PubInitSecrity这个函数的参数设置成SECRITY_MODE_ALL也是可以的,直接让系统去判断该内置还是外接,但是这做法不推荐。
最好明确指定是内置还是外接,可以减少初始化时间;
5、从早期应用程序移植到安全库上涉及密钥的修改有以下几点(包括但不限于):
1通过系统管理员手工输入主密钥
2通过系统管理员通过母POS导入主密钥
3通过系统管理员切换内置和外接时候注意要初始化
4签到时候工作密钥下发的安装
5涉及到多个交易输入Pin密码输入的时候用到的取Pin算法
6涉及到每个交易需要算Mac的时候的取Mac算法
7涉及到一些有磁道加密的等等
6、根据最新的PCI规范是不可以用Pin工作密钥对数据进行加解密之用,故PubDes、PubUnDes、PubDes3、PubUnDes3函数调用使用KEY_TYPE_PIN类型时候会返回失败;
7、内置密码键盘工作密钥只能用KEY_TYPE_PIN、KEY_TYPE_MAC、KEY_TYPE_TRACK类型,而外接密码键盘支持KEY_TYPE_PIN、KEY_TYPE_MAC、KEY_TYPE_TRACK外还支持KEY_TYPE_DATA为了代码统一不建议使用KEY_TYPE_DATA;
6扫盲
何为8位数BCD码?
charszAscString[16+1]={“123456789ABCDEF”};
charszBcdString[8+1]={0};
PubAscToHex(szAscChar,16,0,szBcdString);
szBcdString就是8位的BCD码了;
7备注
提示信息(30字节):
显示的提示界面,在输入前显示;如果输入显示行号设置为1,那么输入时将会将整屏显示清除,如果输入显示行号设置为2,那么输入时只会清除掉屏幕第二行。
提示信息可以支持0x20~0x7f可显ASCII码字符显示,其中0x7f显示为‘¥’;也可以支持汉字,可以直接用内码填充,例如显示“请输入密码”,则直接填充该字串的内码即可;
支持的汉字有:
请输入密码余额元您的再金银联广东深圳欢迎光临天虹商场阳江农信主钥号错手机确认帐单小灵通固话电可用户总积分续费有效币专消大
业中国建设工商身份证
角交通行浦发展招大易
预约
8如有发现错误请联系本人chensj@
应用二部
陈仕剑
2013-04-12