java - IBM 3624 引脚偏移生成

标签 java cryptography

我正在使用 IBM 3624 算法进行引脚生成,然后从中进行偏移。这是来自 IBM Website 的算法:

我不确定顺序,必须使用输入数据。例如,该算法需要验证数据(起始位置、长度、PAN Pad 字符和 Pin 长度)、十进制表 (0123456789012345)、Pin、Pan 和 PDK。

编辑:这是输入数据格式 - PAN(帐号或卡号):16 位十六进制字符串。 Pin(通常为 4 位,但可根据要求更改):4 位数字(十六进制值将从十进制表中替换) PDK(PAN 提供的加密 key ):32 位数字

Start Position & Length : 从 PAN 中选择的数字,最后一位是校验位,将被忽略。 PAN 的这些选定数字随后被填充回 16 位。

填充字符:单个字符(十六进制数字)。

这是我用来执行此操作的代码:

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/

相关文章:

java - 通过 JDBC 发送 DEFAULT 占位符?

javascript - 使用 WebAPI window.crypto.subtle.encrypt() 加密数据时出现 TypeError

ios - 使用 Objective-C 的 AES Java 加密 16 字节 key 解密

c - libsodium crypto_stream_salsa20_xor 的相同输入和输出缓冲区

java - 如何使用 showMessageDialog 中的选项来执行操作?

java - 从 ListBuffer 中移除元素

java - 脚本语言转编译语言还是纯编译语言,哪个更快?

python - hashlib 与 Python 中的 crypt.crypt() 对比。为什么会有不同的结果?

php - 为什么我不能在 PHP OpenSSL 中为 EC 使用小于 384 位的 key 长度?

Java Spring Thymeleaf 下拉列表被禁用并出现