`
javathinker
  • 浏览: 234988 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

PinBlock 算法 使用ANSI x9.8计算

阅读更多

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;
}

分享到:
评论

相关推荐

    ANSI x9.8计算PinBlock

    银行卡交易中,ANSI x9.8计算PinBlock的说明

    ANSI x9.8的技术

    **ANSI X9.8 技术详解** 美国国家标准学会(American National Standards Institute,ANSI)制定了一系列标准,其中ANSI X9.8是关于个人密码加密的重要规范,旨在为金融和其他行业提供安全的数据保护机制。这个标准...

    标准ANSI X9.8 Format的javademo

    简单的java demo实现ANSI X9.8 格式(不带主账号信息) PIN(个人识别码 Personal Identity Number)总共有8个byte长度,分为两个部分;(类似数据包的格式)

    ansix98算法java实现

    AnsiX98算法java实现 ? 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 –...

    pin block计算工具

    pin block计算工具

    pin码计算详解

    PIN Block的格式和计算方法是理解PIN计算的核心部分,可能包括PIN Translation Key(PTK)的使用。 5. **MAC(Message Authentication Code)与完整性检查**:为了防止中间人攻击,8583报文可能会包含MAC,用以验证...

    PINBLOCK/MAC计算器

    用于进行X98算法计算和验算,X99算法计算和验算

    PinBlock工具

    常用的几种PinBlock

    两小时破译无线路由器PIN码算法获得路由密码

    无线路由器PIN码算法破译 无线路由器PIN码算法破译是网络安全中一个非常重要的知识点。本文将详细介绍如何通过扫描附近的无线信号,破译无线路由器的PIN码算法,获得路由密码。同时,本文还将介绍如何防止入侵,...

    ANSI X9.24零售金融业务对称密钥管理第1部分:对称技术 (带详细书签)

    本人收藏的文档,分为2004版和2009版。 非常经典的密钥管理文档,建议搞银行卡收单这一行的程序员仔细读一读...PIN加密、MAC加密、DUKPT。 2009版PDF 网络上一版都没有书签,为了方便自己学习破解PDF后加上了详细书签。

    3DES算法计算MAC

    下面是一个使用 Java 实现 3DES 算法计算 MAC 的示例代码: * 首先,import 相关的包,例如 `java.security.SecureRandom`、`javax.crypto.Cipher`、`javax.crypto.SecretKey`、`javax.crypto.SecretKeyFactory`、`...

    由VIN计算PIN的算法建议20110504.doc

    标题和描述中提到的文档是关于通过车辆识别号码(VIN)计算个人识别码(PIN)的算法建议。VIN是一个全球唯一的17字符序列,用于标识汽车制造商、车型年份、生产序列号等信息。PIN码通常用于汽车的安全系统,如防盗...

    DES加解密_工具

    例如,根据ISO/IEC 9797-1标准,PINBLOCK是将原始PIN扩展到固定长度(如6位扩展到12位),然后按照特定规则进行加密。 **DES加解密工具**:这些工具通常包括了对明文数据进行DES、TDES加密和解密的功能,支持不同...

    银联POSP前置接口报文处理功能库

    ANSI_X9.8算法生成8位PIN: bool TPIN(char *Out,unsigned char *pin,int PINlen,unsigned char *PAN); base64_encode: char * base64_encode(char *s); base64_decode: char * base64_decode(char *s);

    计算pin工具

    打开系统自带的计算器,把计算器设置成科学型(在查看里设置),先选择十六进制,然后输入腾达路由器mac地址的后六位,再点十进制,出来的数就是腾达路由的前七位pin码 小章个人见意:要买就买大厂的路由器,不要买...

    规范ISO9564

    PINblock的使用使得在银行网络和ATM机等设备间传输的PIN数据无法被轻易解读,提高了金融交易的安全性。 标签中的“ISO 9564 PIN Block”进一步明确了这个标准关注的焦点是PINblock的处理。PINblock是由PIN和特定的...

    两小时破译无线路由器PIN码算法获得路由密码网络安全.docx

    文中提到了PIN码算法被破解的情况,攻击者可以通过嗅探无线信号捕获路由器的MAC地址,并利用MAC地址的一部分计算出WPS PIN码的前6位。由于PIN码总共只有8位,攻击者只需尝试剩下的两位即可完全确定PIN码,从而获取...

    mac 计算pin码软件

    5. **软件的使用**:使用PIN码计算软件时,用户可能需要按照软件的指导输入相关信息,如卡片号、安全代码等,软件会根据特定算法计算出PIN码。在输入敏感信息时,确保软件来源可靠,避免个人信息泄露。 6. **安全...

    RSA算法与DES算法的实现

    3. 最后用欧几里德扩展算法计算解密密钥 d,以满足 ed = 1(mod(p–1) (q–1)) 即 d = e–1 mod((p–1)(q–1)) e 和 n 是公钥,d 是私钥 加密公式如下: ci = miê(mod n) 解密时,取每一密文分组 ci 并计算: ...

    PIN码第8位算法

    PIN码第8位算法,一句前7位,计算第8位PIN码的公式,2种,及相应说明

Global site tag (gtag.js) - Google Analytics