我正在使用 IBM 3624 算法进行 Pin 生成,然后是它的偏移量。这是来自 IBM Website 的算法:
我不确定顺序,必须使用输入数据。例如,该算法需要验证数据(Start Pos、Length、PAN Pad Character & Pin Length)、Decimalization 表(0123456789012345)、Pin、Pan 和 PDK。
编辑:这是输入数据格式 -
PAN(帐号或卡号):16 位十六进制字符串。
Pin(通常为 4 位,但可以根据要求更改):4 位数字(要从十进制表中替换的十六进制值)
PDK(随 PAN 提供的加密 key ):32 位数字
起始位置和长度:从 PAN 中选择的数字,最后一位是校验位,将被忽略。这些选定的 PAN 数字后来被填充回 16 位数字。
Pad Char:单个字符(一个十六进制数字)。
这是我用来执行此操作的代码:
public static void CalculatePINOffset(String PAN, String Pin, String PDKkey, String DecTab, int StartPos, int Length,
char PadChar) throws Exception{
int PANLength = PAN.length();
if(Length != (PANLength - StartPos)){
throw new Exception(
"Invalid 'Start Pos and Length' format.");
}
//Padding the PAN before Start POS with Pad Chars back to 16 digits.
String block = ISOUtil.padleft(PAN.substring(StartPos, Length + (StartPos - 1)), PAN.length(), PadChar);
/*
* Doing encryption stuff on block with PDKKey.
* The execute function basically encrypts block and PDKKey, and any algorithm could do the work.
*/
String result = execute(block , PDKkey, "2TDES");
Map<Character, Character> decTab = new HashMap<Character, Character>();
decTab.put('A', '0');
decTab.put('B', '1');
decTab.put('C', '2');
decTab.put('D', '3');
decTab.put('E', '4');
decTab.put('F', '5');
//Replacing Hex Characters with numbers from Decmalization table.
char[] Inpin = result.substring(0, 4).toCharArray();
for(int i = 0; i < Inpin.length; i++){
if(decTab.containsKey(Inpin[i])){
Inpin[i] = decTab.get(Inpin[i]);
}
}
result = new String(Inpin);
System.out.println("Intermediate PIN: "+result);
//Calculating offset from Intermediate Pin.
int[] Offset = new int[4];
int Cpin;
int Ipin;
for(int i = 0; i < result.length(); i++){
Ipin = Integer.parseInt(result.substring(i, i+1));
Cpin = Integer.parseInt(Pin.substring(i, i+1));
if((Cpin - Ipin) >= 0){
Offset[i] = (Cpin - Ipin);
}
else{
Offset[i] = (Ipin - Cpin)%10;
}
}
String PinOffset = Arrays.toString(Offset);
System.out.println("Pin Offset: " + PinOffset);
}
注意:我不是在寻找代码或实现。我提供了这段代码是为了更好地解释使用顺序。所有能帮助我的是正确的加密顺序、验证数据和十进制表的使用。
当使用 BP - Tools 等开源工具进行交叉检查时,生成的偏移量和引脚不匹配。我哪里做错了?
最佳答案
好的,我想通了。如果有人正在寻找相同的内容,请执行以下操作:
1. Generate validation data from PAN:
- Get PAN Digits from Start Position to Length, and add Pad characters to the right, until it was 16 digits in length.
2. Encrypt validation data with pdk key using DES, 3DES or AES algorithm. This will generate an encrypted code.
3. Decimalize encrypted code using decimalization table.
4. Convert to Hex String, and get the first n digits (n = pin length). This will generate intermediate Pin.
5. Finally, Modulo Subtract intermediate pin with customer pin. This generates the Offset.
希望这可以帮助。
- 谢谢!
关于java - IBM 3624 引脚偏移生成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26849323/