根据银联POS终端应用规范,我们了解到POS交易中保函两类密钥:
密钥加密密钥 key encryption key; KEK和工作密钥 working key; WK
而工作密钥有包括:PIN加密密钥、 MAC计算的密钥和磁道数据加密密钥

关于以上密钥的定义,银联规范中是这样解释的:

密钥加密密钥 key encryption key; KEK
POS终端工作时对工作密钥进行加密的密钥,由专门人员设置并直接保存在系统硬件中,只能使用,
不能读取,该密钥必须与加密算法放在同一加密芯片里,又称终端主密钥。

工作密钥 working key; WK
也称为数据密钥,通常指PIN加密密钥、 MAC计算的密钥和磁道数据加密密钥。 工作密钥必须经常
更新。在联机更新的报文中对工作密钥必须用密钥加密密钥( KEK)加密,形成密文后进行传输。

密钥加密密钥,我们也称之为主密钥,为32位的16进制字符串

在规范里,讲到第62域,用法一:终端密钥,域描述中写到:

*POS中心向POS终端约定的新工作密钥,若长度域不为024或040或056或060或84,将认为该域格式有误。
在POS终端签到的应答消息中,本域的长度应为24或40或56或60或84个字节,存放由POS中心产生的POS终端新工作密钥。
对于单倍长密钥算法,前12个字节为PIN的工作密钥的密文, 后12个字节为MAC的工作密钥的密文。(其中,前8个字节是密文,后4个字节是checkvalue;前8个字节解出明文后,对8个数值0做单倍长密钥算法,取结果的前四位与checkvalue 的值比较应该是一致的)。
对于双倍长密钥算法,前20个字节为PIN的工作密钥的密文,后20个字节为MAC的工作密钥的密文。(其中,“ PIN工作密钥”前16个字节是密文,后4个字节是checkvalue;前16个字节解出明文后,对8个数值0做双倍长密钥算法,取结果的前四位与checkvalue 的值比较应该是一致的;“ MAC工作密钥”前8个字节是密文,再8个字节是二进制零,后4个字节是checkvalue;前8个字节解出明文后,对8个数值0做单倍长密钥算法,取结果的前四位与checkvalue 的值比较应该是一致的)。
对于支持磁道加密的签到报文本域长度为60字节,采用双倍长密钥算法,前20个字节为PIN的工作密钥的密文,中间20个字节为MAC的工作密钥,后面20个字节为TDK的工作密钥的密文。(其中,“ PIN工作密钥”前16个字节是密文,后4个字节是checkvalue;前16个字节解出明文后,对8个数值0做双倍长密钥算法, 取结果的前四位与checkvalue 的值比较应该是一致的;“ MAC工作密钥”前8个字节是密文,再8个字节是二进制零,后4个字节是checkvalue;前8个字节解出明文后,对8个数值0做单倍长密钥算法,取结果的前四位与checkvalue 的值比较应该是一致的;“ TDK工作密钥”前16个字节是密文,后4个字节是checkvalue;前16个字节解出明文后,对8个数值0做双倍长密钥算法,取结果的前四位与checkvalue的值比较应该是一致的)*

在这里我就按最复杂的第三种来实现(java):
第一步:获取终端的主密钥,我们采用随机生成的方式来生成,生成的主密钥需要手动设置到POS机中

public static String randomHexString(int len)  {try {StringBuffer result = new StringBuffer();for(int i=0;i<len;i++) {result.append(Integer.toHexString(new Random().nextInt(16)));}return result.toString().toUpperCase();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return null;
}

第二步,POS终端签到,获取工作密钥
1、生成PIN的工作密钥:

String pik = KeyUtil.randomHexString(32);

2、拿主密钥对PIN工作密钥进行双倍长加密,生成前16位的密文

String pikEnc = DesUtil.doubleDesEncrypt(minKey, pik);

3、拿PIN工作密钥对8个数值0做双倍长加密,生成checkValue

String checkValue = DesUtil.doubleDesEncrypt(pik, "0000000000000000").substring(0,8); 

4、拼接,生成最终要返回的结果

String pik = pikEnc + checkValue;

TDK工作密钥和PIN工作密钥生成规则一样

MAC工作密钥生成:

String mak = KeyUtil.randomHexString(16);
String makEnc = DesUtil.doubleDesEncrypt(minKey, mak);
String checkValue = DesUtil.desEncrypt(mak, "0000000000000000").substring(0,8); //单倍长加密
String mak = makEnc + "0000000000000000"  + checkValue;

附:双倍长加密算法:

public static String doubleDesEncrypt(String key,String data) throws Exception{return bytesToHexString(doubleDesEncrypt(hexStringToByte(key), hexStringToByte(data)));
}
public static byte[] doubleDesEncrypt(byte[] key,byte[] data) throws Exception{byte[] result = null;if(key.length != 16) {throw new Exception("expected length of des key is 16! [" + key.length +"]");}// 拆分密钥byte[] keyLeft = new byte[8];byte[] keyRight = new byte[8];System.arraycopy(key, 0, keyLeft, 0, 8);System.arraycopy(key, 8, keyRight, 0, 8);// 使用Left进行加密byte[] tmp = desEncrypt(keyLeft, data);tmp = desDecrypt(keyRight, tmp);result = desEncrypt(keyLeft, tmp);return result;
}

单倍长加密算法:

public static String desEncrypt(String key,String data) throws Exception{return bytesToHexString(desEncrypt(hexStringToByte(key), hexStringToByte(data)));
}
public static byte[] desDecrypt(byte[] key,byte[] data) throws Exception{return des(key, data, Cipher.DECRYPT_MODE);
}
private static byte[] des(byte[] key,byte[] data,int opmode) throws Exception{byte[] result = null;try {// 数据长度必须为8的倍数if(data.length%8 != 0) {throw new Exception("expected length of des data must multiple of 8! [" + data.length +"]");}SecretKeyFactory keyFactory;DESKeySpec dks = new DESKeySpec(key);keyFactory = SecretKeyFactory.getInstance("DES");SecretKey secretkey = keyFactory.generateSecret(dks);//创建Cipher对象Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");//初始化Cipher对象cipher.init(opmode, secretkey);result = new byte[data.length];// 如果数据超过8位,循环每8位进行加解密,然后进行拼接int offset = 0;for (int i = 0; i < data.length/8; i++) {// 需要处理的数据逐8位取出byte[] tmp = new byte[8];System.arraycopy(data, offset, tmp, 0, 8);// 进行加解密计算byte[] tmpResult = cipher.doFinal(tmp);// 放入返回结果中System.arraycopy(tmpResult, 0, result, offset, 8);offset += 8;}} catch (Exception e) {e.printStackTrace();throw new SeaException(e);}return result;}

银联POS工作密钥生成相关推荐

  1. 银联Pos终端签到、签退、批结算、批上送、PinKey、MacKey、KEK、主密钥、工作密钥、TPDU、报文头

    原文: http://blog.csdn.net/lvxiangan/article/details/41014439 加密密钥:KEK,terminal keys encrypting key; K ...

  2. POS主密钥与工作密钥关联详解

    以下是针对POS的卡交易的一种密钥逻辑记录: 一.密钥介绍 交易主密钥:加载到Pos机中,用于验证工作密钥是否合法等: 工作密钥:包括PIN密钥.MAC密钥.磁道密钥,用于加密密码.MAC.磁道信息. ...

  3. Pos的工作密钥、主密钥、工作密钥属性和作用

    近期在从事Pos应用的开发,由于之前未接触过相关开发,所以很多概念性的东西不是很明白,因此做下总结记录供以后查阅,参考了其他人的博客.链接在博客底部. 目前来说主要接触密钥的分别时:工作密钥 主密钥 ...

  4. Android开发之银联工作密钥,主密钥,传输密钥(加解密图文展示)

    一.密钥说明 主密钥和工作密钥都有明文,密文的概念,如果其密钥中带有校验值,表示其密钥是密文,反之是明文!第二小节会说明校验值的作用.且密钥的密文以及明文都是由服务器下发,服务器开发人员定好每种密钥的 ...

  5. 银联POS机为何要签到?签到失败怎么办?

    一.POS机签到的定义 POS机签到分操作员签到和POS机签到. POS机操作员签到是验证操作员的合法性,需要输入操作员号(柜员号)和密码,部分只需要输入密码,该签到在POS机上完成,属于脱机操作. ...

  6. 智能 pos 机 密钥逻辑

    概念 明文密码 即传输或保存为明文的密码.具体是指保存密码或网络传送密码的时候,用的是没有隐藏.直接显示的明文字符,而不是经过加密后的密文.如密码本身是123,明文密码就直接显示本体123.从信息安全 ...

  7. ubuntu生成密钥和证书_基于浏览器的密钥生成以及与浏览器的密钥/证书存储的交互...

    ubuntu生成密钥和证书 想象以下情况: 您需要从访问您的网站的用户那里获取一个密钥(在非对称情况下为用户的公共密钥 ),并希望浏览器记住私有部分,而不会因冗长的导入过程而困扰用户. 老实说,实际上 ...

  8. RSA密钥生成、加密解密、数据签名验签

    公钥.私钥生成 准备工作,基础的帮助类 使用java代码生成公钥私钥 使用openssl生成公钥私钥 加解密 数据签名及验签 数据加解密及签名验签测试 注意项 公钥.私钥生成 准备工作,基础的帮助类 ...

  9. 3GPP机密性和完整性算法规范128-EEA3和128-EIA3(一)----密钥生成原理

    3GPP机密性和完整性算法规范128-EEA3和128-EIA3(一)----密钥生成原理 3GPP机密性和完整性算法规范128-EEA3和128-EIA3(二)----祖冲之算法的C语言实现 3GP ...

  10. 什么是主密钥、工作密钥、会话密钥、PIN密钥?

    什么是主密钥? 主秘钥,即(Terminal Master Key) TMK,主要作用是用来验证工作秘钥是否合法,以及加密TPK(终端PIN密钥),保证TPK在传输线路上的安全性.一般情况下是人工在P ...

最新文章

  1. 【资源共享】RK3288 WiFiBT 开发配置参考说明
  2. java 内部类怎么new_[转]【Java】内部类(Inner Class)如何创建(new)
  3. 【转】独家教程:用PHP编写Android应用程序
  4. 一个反编译工具Reflactor (.NET)
  5. SpringBoot+Dubbo集成ELK实战
  6. Game of Cards Gym - 102822G
  7. java实践_Java怪异实践
  8. matlab imf1,NGPM_v1.4y GA多目标优化的程序 带约束 里面有教程 matlab 272万源代码下载- www.pudn.com...
  9. bootstrap table 服务器端分页--ashx+ajax
  10. 人性的弱点---第三篇---得人同意于你的十二种方法3
  11. h3c交换机端口加入vlan命令_h3c交换机vlan配置划分命令
  12. [2] UI原型设计工具Pencil Project 学习系列----- 入门
  13. html表格填充空白单元格,快速填充数据表格中的空白单元格
  14. imo CEO乔月猛:我们是史上研发投入最大的创业团队
  15. 【编译原理学习笔记】1:符号和符号串,文法和语言,文法的类型
  16. Github标星的Chrome 插件,开发者必备
  17. 数据驱动「付费转化」的3个思路
  18. 廖雪峰python教程整理笔记_python小白01廖雪峰python教程笔记
  19. 微信个人号机器人接口
  20. 快速了解Swagger及其快速入门

热门文章

  1. CI(CodeIgniter)框架结构介绍
  2. cloudMusic.mps的前世今坑
  3. seo清洗百万长尾词数据的策略
  4. 计算机算力英语怎么说,MIT警告深度学习正逼近算力极限,突破瓶颈会让人类成为上帝?...
  5. 医疗健康APP的开发和设计
  6. 聊聊从古至今都是如何加密的~
  7. java-信息安全(十六)-双向认证
  8. 全球餐厅库存管理软件行业调研及趋势分析报告
  9. 戴尔显示rpc服务器,swmm(暴雨管理模型)安装完成后运行显示 RPC服务器不可用
  10. 给MDK5/KEIL5安装51/ARM编译坏境