我们可以通过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的授权。所以在调用命令前要看下是否已经授权。(不同的加密机可能设置的地方也不同)