銀聯PIN加密演算法的實現,演算法規則參考pos銷售終端規範(如有需要,可聯絡博主索取或自行百度,本文僅上實現)

/**
     * 格式化PIN
     *
     * @param pin
     * @return
     */
    private byte[] formatPinByX98(byte[] pin) {

        byte[] encode = new byte[8];
        encode[0] = (byte) 0x06;
        encode[1] = (byte) ((pin[0] & 0x0F) << 4 | (pin[1] & 0x0F));
        encode[2] = (byte) ((pin[2] & 0x0F) << 4 | (pin[3] & 0x0F));
        encode[3] = (byte) ((pin[4] & 0x0F) << 4 | (pin[5] & 0x0F));
        encode[4] = (byte) 0xFF;
        encode[5] = (byte) 0xFF;
        encode[6] = (byte) 0xFF;
        encode[7] = (byte) 0xFF;
        return encode;
    }


/**
     * 格式化PAN
     *
     * @param pan
     * @return
     */
    private byte[] formartPan(byte[] pan) {
        byte[] encode = new byte[8];
        encode[0] = 0x00;
        encode[1] = 0x00;
        encode[2] = (byte) ((pan[0] & 0x0F) << 4 | (pan[1] & 0x0F));
        encode[3] = (byte) ((pan[2] & 0x0F) << 4 | (pan[3] & 0x0F));
        encode[4] = (byte) ((pan[4] & 0x0F) << 4 | (pan[5] & 0x0F));
        encode[5] = (byte) ((pan[6] & 0x0F) << 4 | (pan[7] & 0x0F));
        encode[6] = (byte) ((pan[8] & 0x0F) << 4 | (pan[9] & 0x0F));
        encode[7] = (byte) ((pan[10] & 0x0F) << 4 | (pan[11] & 0x0F));
        return encode;

    }
byte[] pan = formartPan(pan);
        byte[] pin = formatPinByX98(pin);
        for (int i = 0; i < pin.length; i++) {//異或
            pin[i] ^= pan[i];
        }
        //異或完後執行加密,以下邏輯可根據自己實際需求處理



以上函式 傳入的   pan  和 pin  均為ASCII。

轉載請註明出處!