之前看到几篇介绍,把ANSI说成16个字节,真心扯淡,各种误人子弟,真正的ANSI算法其实是8个字节,具体格式如下:
(1) ANSI X9.8 Format(不带主账号信息)
PIN(个人识别码 Personal Identity Number)总共有8个byte长度,分为两个部分;(类似数据包的格式)
1:Byte1 记录PIN的长度
2:Byte2-Byte8 6-12位(字符)PIN(每个字符占4个BIT,不足8位右补F)
例如:明文PIN为 123456,
则PIN BLOCK为 0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF
0x06记录了PIN的长度为6,后边不足16位均以F补齐,然后转换为BCD码(BCD码为8位二进制数为一个单元,也就是一个Byte的大小也是一个十六进制数HEX的占用长度)。
(2)ANSI X9.8 Format(带主帐号信息)
PIN BLOCK 格式:等于 PIN 按位异或主帐号
PIN 格式:(与1中的格式类似)
Byte 1 PIN的长度
Byte 2 – Byte 3/4/5/6/7 4--12个PIN(每个PIN占4个BIT)
Byte4/5/6/7/8 – Byte 8 FILLER “F” (每个“F“占4个BIT)
PAN(主帐号 Primary Account Number)同样包含8个byte,格式如下:
Byte 1 — Byte 2 0x00 0x00
Byte 3 — Byte 8 12个主帐号字符(最后一位为校验位)
12位字符主帐号的取法:取主帐号的右12位(不包括最右边的校验位),不足12位左补“0X00”。
例子:
明文 PIN:123456,
主帐号 PAN:123456789012345678
截取下的主帐号为:678901234567 (最后一位校验位8的前12位字符为截取的主帐号)
则用于PIN加密的主帐号为:0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67
则 PIN BLOCK (PIN按位异或主帐号PAN)
即是为: 0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF
异或上: 0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67
结果为: 0x06 0x12 0x53 0xDF 0xFE 0xDC 0xBA 0x98
算法源码:(包含一个工具类Util和一个转换类ANSIFormat.java)
Util.java
package CodeApe;
public class Util {
public Util() {
}
public static void printHexString(String hint, byte[] b) {
System.out.print(hint);
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
System.out.print(hex.toUpperCase() + " ");
}
System.out.println("");
}
public static String Bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
.byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
.byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
public static byte[] HexString2Bytes(String src) {
byte[] ret = new byte[8];
byte[] tmp = src.getBytes();
for (int i = 0; i < 8; i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
}
ANSIFormat.java
package CodeApe;
import java.io.ObjectInputStream.GetField;
import javax.annotation.processing.Processor;
import CodeApe.Util;
public class ANSIFormat {
private String pin;
private String accno;
public ANSIFormat(String pin , String accno){
this.pin = pin;
this.accno = accno;
}
public byte[] process(String pin, String accno) {
byte arrPin[] = getHPin(pin);
byte arrAccno[] = getHAccno(accno);
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;
}
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;
}
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;
}
}
test.java(测试类)
package CodeApe;
public class test {
private static ANSIFormat pass;
public static void main(String[] args) {
// TODO Auto-generated method stub
String pin = "123456";
String accno = "123456789012345678";
System.out.println("encoded pin:"+pin);
System.out.println("encoded accno:"+accno);
pass = new ANSIFormat(pin, accno);
byte[] b = pass.process(pin, accno);
}
}
ANSI <wbr>X9.8标准 <wbr>PIN <wbr>xor <wbr>PAN获取PIN <wbr>BlOCK

- 大小: 92.5 KB
分享到:
相关推荐
本文将详细解析"XOR.rar_52xor25计算结果_XOR_XOR 8bit 算法_异或运算"所涉及的知识点。 首先,XOR(异或)运算是一种二元逻辑运算,它有两个输入和一个输出。如果两个输入位相同,输出为0;如果两个输入位不同,...
VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 xor2VHDL例程源码 ...
本文将详细介绍几种常见的MAC算法:XOR MAC算法、ANSI X9.9 MAC算法、ANSI X9.19 MAC算法以及银联MAC算法,并通过流程图和步骤说明来帮助理解这些算法的工作原理。 #### 二、XOR MAC算法 XOR MAC算法是一种基于...
《XOR加密技术详解及其在"xor加密.exe"中的应用》 XOR(异或)加密是一种简单而有效的加密手段,常被用于程序保护、数据隐藏等领域。在信息技术中,XOR运算因其特性——相同的输入产生0,不同的输入产生1,而被广泛...
本文将详细介绍三种常见的加密算法:AES、DES和XOR,并在VB.NET环境下,结合VS2013开发工具,探讨它们的实现方法。 首先,我们来看AES(Advanced Encryption Standard),即高级加密标准。AES是目前最广泛使用的...
在IT行业中,XOR(异或)操作是一种基本的位操作,它在计算机科学和编程中扮演着重要的角色。在“xor文件.zip”这个压缩包中,我们可以推测它可能包含了一些与XOR操作相关的文件或者教程。下面我们将深入探讨XOR操作...
这个名为“XOR.zip”的压缩包包含了一个异或校验工具,该工具能够帮助用户快速计算16进制字符串的异或校验码。这里我们将深入探讨异或运算以及如何使用它来进行校验。 异或(XOR,exclusive OR)是一种逻辑运算符,...
%%使用fisher判别给XOR问题分类 使用fisher判别给XOR问题分类
XOR(异或)加密是一种简单的加密方法,广泛应用于数据隐藏和初步的数据保护。它的基本原理是:将明文与一个密钥进行异或操作,得到密文;解密时,再将密文与相同的密钥进行异或,即可恢复原文。在本案例中,我们有...
由于异或的对称性,这使得XOR加密算法在实现上非常简单,但也因为其相对简单的结构,可能在安全性上不如更复杂的加密算法,如AES(高级加密标准)。 在VC++环境中,实现XOR 256加密通常涉及以下几个步骤: 1. **...
在IT领域,XOR(异或)操作是一种基本的逻辑运算,它在计算机科学和编程中扮演着重要的角色。本文将深入探讨XOR的概念、在C++中的应用以及与BP神经网络(BackPropagation Neural Network)的关联。 XOR,全称是...
此外,由于异或运算的交换律(A XOR B = B XOR A)和结合律(A XOR (B XOR C) = (A XOR B) XOR C),这款工具也可能包含一些高级功能,比如批量异或多个数值,或者保存/加载异或历史记录,方便用户进行多次异或操作...
在实际应用中,如需高度安全的数据保护,应考虑使用更复杂的加密算法,如AES(高级加密标准)或RSA等。 总之,这个Delphi实例为初学者提供了一个了解XOR加密原理和实践的好机会,但对于实际项目中的敏感数据保护,...
标题中的“Xor.rar_SVM XOR matlab_XOR_xor by matalb”暗示了这是一个关于使用支持向量机(SVM)和Matlab解决异或(XOR)问题的项目。在机器学习领域,异或问题因其非线性特性而被视为一个经典的教学案例,通常用于...
为了确保数据的完整性和准确无误,XOR校验和字符转换工具集应运而生,它提供了一套完整的解决方案,用以检测数据是否在传输或存储过程中出现错误。 XOR校验和字符转换工具集的核心功能是XOR校验。XOR校验是一种通过...
在IT行业中,XOR(异或)是一种基本的逻辑运算符,广泛应用于各种算法和程序设计中。XOR,即“Exclusive OR”,它的特点是当两个输入位不同时,结果为1;而当两个输入位相同时,结果为0。这个特性使得XOR在数据处理...
XOR 效验 算KEY程序 非常好用的
标题中的“nns xor.rar_XOR_XOR c++_bp xor”表明这是一个关于神经网络(nns)解决异或(XOR)问题的项目,使用了C++编程语言,并且采用了反向传播(BP)算法。这个压缩包可能包含相关的源代码、数据集和文档,如...
标签"xor matlab_xor neural_xor_matlab zip"进一步确认了这个主题,其中"xor"指的是异或操作,"matlab_xor"表明代码是用MATLAB编写的,"neural_xor_matlab"强调是用MATLAB实现的神经网络来解决XOR问题,"zip"则表示...
在数字电路设计中,XOR(异或)门是一种基本逻辑运算单元,它在很多应用场景中都有着重要的作用,比如数据加密、错误检测和纠正、数据比较等。在 FPGA(Field Programmable Gate Array,现场可编程门阵列)设计中,...