java 获取pinblock_如何从pinblock获得pin

我们可以通过pin和卡号(主账号 —

acctNo)来生成pinBlock,那么解密pinBlock时,是怎么从pinblock获得pin的呢?其实逆向一下就可以了。

计算pinBlock的算法中很重要的思想就是会将字符'123456'转换为字节形式

0x12, 0x34, 0x56​

首先我们来看看是怎么通过pin和​acctNo来获得pinBlock的

pin:123456, 卡号:62261256987265​

1. 先对卡号进行处理:去除最后一位校验位,然后进行12位的截取​

62261256987265

截取62261256987265,然后为了补齐长度为8个字节,再在前面添加0x00,于是最后结果就是:0000226125698726

字节形式就是 0x00, 0x00, 0x22, 0x61, 0x25, 0x69, 0x87,

0x26

2. 然后对pin进行处理:获取pin的长度以及在后面补F

pin:123456,长度为6​,所以第一个字节为长度0x06,

之后就是pin转为字节形式,最后补位F,转换后为06123456FFFFFFFF

字节形式就是0x06, 0x12, 0x34, 0x56, 0xFF, 0xFF, 0xFF, 0xFF

3. 将处理过的卡号和pin进行异或得到结果(也就是pinBlock):

06121637da9678d9​

字节形式就是0x06, 0x12, 0x16, 0x37, 0xda, 0x96, 0x78, 0xd9

​我们就可以通过这个过程的逆过程来获得pin

​因为pin 异或 acctNo后得到

pinBlock,根据异或的原则如果A异或B结果为C,那么A异或C的结果就是B了。

所以我们只要将pinBlock和acctNo异或就可以得到pin了

​1. 还是先对卡号进行处理,和之前获得pinBlock时的处理方式是一样的

62261256987265

截取62261256987265,然后为了补齐长度为8个字节,再在前面添加0x00,于是最后结果就是:0000226125698726

字节形式就是 0x00, 0x00, 0x22, 0x61, 0x25, 0x69, 0x87,

0x26

​2. 将处理过的卡号和pinBlock进行异或

将​处理过的卡号:0x00, 0x00, 0x22, 0x61, 0x25,

0x69, 0x87, 0x26

和pinBlock:0x06, 0x12, 0x16, 0x37, 0xda, 0x96,

0x78, 0xd9

进行异或,很显然这里的结果就是:

​0x06, 0x12, 0x34, 0x56,

0xFF, 0xFF, 0xFF, 0xFF

3. 解析结果获得真正的pin

根据第一个字节是0x06,得到pin的长度为6,于是只要获取第一个字节后的3个字节就可以了,也就是0x12,

0x34, 0x56

我们知道处理pin是将字符形式的pin转换为字节形式,于是我们将字节形式转换为字符形式就可以了,将0x12,

0x34, 0x56转换为'123456'

所以最后得到的真正的pin就是:123456

至此,我们就通过pinBlock和acctNo获得了pin的明文了。​

PS:调用加密机解密pin的命令时可能会需要在加密机的终端控制软件上打开解密pin的授权。所以在调用命令前要看下是否已经授权。(不同的加密机可能设置的地方也不同)

a4c26d1e5885305701be709a3d33442f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值