java 获取pinblock_PinBlock 算法 使用ANSI x9.8计算 | 学步园

news/2024/7/6 0:40:16

PIN格式

ANSI X9.8 Format(带主帐号信息)

PIN BLOCK 格式等于 PIN 按位异或主帐号:

PIN 格式:

BYTE 1 PIN的长度

BYTE 2 – BYTE 3/4/5/6/7   4--12个PIN(每个PIN占4个BIT)

BYTE 4/5/6/7/8 – BYTE 8   FILLER “F” (每个“F“占4个BIT)

主帐号格式:

BYTE 1 — BYTE 2  0X0000

BYTE 3 — BYTE 8 12个主帐号

12位主帐号的取法:取主帐号的右12位(不包括最右边的校验位),不足12位左补“0X00”。

例如:明文 PIN 123456,

设:磁卡上的主帐号为:123456789012345678

截取下的主帐号为:678901234567 则

用于PIN加密的主帐号为:0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67

则 PIN BLOCK 为 0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF

异或 0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67

结果为 0x06 0x12 0x53 0xDF 0xFE 0xDC 0xBA 0x98

设:磁卡上的主帐号为:1234567890123456

截取下的主帐号为:456789012345

则用于PIN加密的主帐号为:0x00 0x00 0x45 0x67 0x89 0x01 0x23 0x45

则 PIN BLOCK 为 0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF

异或 0x00 0x00 0x45 0x67 0x89 0x01 0x23 0x45

结果为 0x06 0x12 0x71 0x31 0x76 0xFE 0xDC 0xBA

? PIN 加密解密

省中心(外围系统)在发送消息给全国中心(省中心)之前,

应用本中心的PIK对PIN加密后发往全国中心(省中心)。

/**

* getPinBlock

* 标准ANSI X9.8 Format(带主帐号信息)的PIN BLOCK计算

* PIN BLOCK 格式等于 PIN  按位异或  主帐号;

* @param pin String

* @param accno String

* @return byte[]

*/

private byte[] process(String pin, String accno) {

byte arrAccno[] = getHAccno(accno);

byte arrPin[] = getHPin(pin);

byte arrRet[] = new byte[8];

//PIN BLOCK 格式等于 PIN  按位异或  主帐号;

for (int i = 0; i < 8; i++) {

arrRet[i] = (byte) (arrPin[i] ^ arrAccno[i]);

}

Util.printHexString("PinBlock:", arrRet);

return arrRet;

}

/**

* getHPin

* 对密码进行转换

* PIN格式

* BYTE 1 PIN的长度

* BYTE 2 – BYTE 3/4/5/6/7   4--12个PIN(每个PIN占4个BIT)

* BYTE 4/5/6/7/8 – BYTE 8   FILLER “F” (每个“F“占4个BIT)

* @param pin String

* @return byte[]

*/

private byte[] getHPin(String pin) {

byte arrPin[] = pin.getBytes();

byte encode[] = new byte[8];

encode[0] = (byte) 0x06;

encode[1] = (byte) Util.uniteBytes(arrPin[0], arrPin[1]);

encode[2] = (byte) Util.uniteBytes(arrPin[2], arrPin[3]);

encode[3] = (byte) Util.uniteBytes(arrPin[4], arrPin[5]);

encode[4] = (byte) 0xFF;

encode[5] = (byte) 0xFF;

encode[6] = (byte) 0xFF;

encode[7] = (byte) 0xFF;

Util.printHexString("encoded pin:", encode);

return encode;

}

/**

* getHAccno

* 对帐号进行转换

* BYTE 1 — BYTE 2  0X0000

* BYTE 3 — BYTE 8 12个主帐号

* 取主帐号的右12位(不包括最右边的校验位),不足12位左补“0X00”。

* @param accno String

* @return byte[]

*/

private byte[] getHAccno(String accno) {

//取出主帐号;

int len = accno.length();

byte arrTemp[] = accno.substring(len < 13 ? 0 : len - 13, len - 1).getBytes();

byte arrAccno[] = new byte[12];

for (int i = 0; i < 12; i++) {

arrAccno[i] = (i <= arrTemp.length ? arrTemp[i] : (byte) 0x00);

}

byte encode[] = new byte[8];

encode[0] = (byte) 0x00;

encode[1] = (byte) 0x00;

encode[2] = (byte) Util.uniteBytes(arrAccno[0], arrAccno[1]);

encode[3] = (byte) Util.uniteBytes(arrAccno[2], arrAccno[3]);

encode[4] = (byte) Util.uniteBytes(arrAccno[4], arrAccno[5]);

encode[5] = (byte) Util.uniteBytes(arrAccno[6], arrAccno[7]);

encode[6] = (byte) Util.uniteBytes(arrAccno[8], arrAccno[9]);

encode[7] = (byte) Util.uniteBytes(arrAccno[10], arrAccno[11]);

Util.printHexString("encoded accno:", encode);

return encode;

}


http://www.niftyadmin.cn/n/3573275.html

相关文章

LeetCode 496、下一个更大元素 I

496、下一个更大元素 I 1&#xff09;题目描述 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于…

java自然语言理解分频_如何评价华为 2019 年 11 月 25 日发布的 Sound X 智能音箱?...

HiFi智能&#xff0c;华为Sound X 回归音箱本质&#xff0c;提供真正的环绕立体声效果。同时&#xff0c;并没有牺牲智能交互体验。接下来&#xff0c;带大家去了解这款新品的更多信息&#xff01;声智科技基于SoundAI Cimon声学软件和SoundAI Babel开放大脑&#xff0c;为华为…

MySQL5.6与5.7的区别——及MySQL5.6版本安装

一、MySQL5.7对比5.6的优势1.安全性2.灵活性4.易用性5.可用性6.性能优势7.默认参数的改变8.安装不同二、MySQL 5.6 的安装步骤1.查看并解压源码包2.安装环境3.CMAKE编译并安装4.配置my.cnf和启动脚本5.添加环境变量6.创建程序账号&#xff0c;并授权7.初始化MySQL配置8.开启数据…

51nod 1416:两点 深搜

1416 两点题目来源&#xff1a; CodeForces基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 20 难度&#xff1a;3级算法题收藏关注福克斯在玩一款手机解迷游戏&#xff0c;这个游戏叫做”两点”。基础级别的时候是在一个nm单元上玩的。像这样&#xff1a; …

四川轻工与计算机学院校训,常州轻工职业技术学院校训及含义:诚信 笃实 勤俭 创新...

校训历来是一所学校珍贵的价值遗产和宝贵的精神财富&#xff0c;是一所学校精神的集中表达。新东方在线高考网特别整理了常州轻工职业技术学院校训&#xff0c;供参考&#xff01;诚信 笃实 勤俭 创新——常州轻工职业技术学院校训。校训是一所学校长期以来办学理念、办学风格的…

mysql数据库主从同步(非交互式)

mysql数据库主从同步非交互式配置步骤&#xff0c;本文以一台mysql数据库多实例3306和3308为例进行配置&#xff0c;3306为主库&#xff0c;3308为从库&#xff08;多台单实例与一台多实例配置是一样的&#xff09;一.my.cnf文件配置1.修改my.cnf配置文件&#xff0c;主数据库3…

LeetCode 1232、缀点成线

1232、缀点成线 1&#xff09;题目描述 给定一个数组 coordinates &#xff0c;其中 coordinates[i] [x, y] &#xff0c; [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断&#xff0c;这些点是否在该坐标系中属于同一条直线上。 示例 1&#xff1a; 输入&#xff1a;…

java并发编程 性能与可伸缩性_Java并发编程实战 第11章 性能与可伸缩性

关于性能性能的衡量标准有很多&#xff0c;如&#xff1a;服务时间&#xff0c;等待时间用来衡量程序的"运行速度""多快"。吞吐量&#xff0c;生产量用于衡量程序的"处理能力"&#xff0c;能够完成"多少"工作。多快和多少有时候是互相…