/**
   * 1:ANSI X9.8 Format(不带主账号) 06
   *
   * @param password
   * @param pinKey
   * @return
   * @throws Exception
   */
  public static String pinEncode(String password, byte[] pinKey) throws Exception {
    int passwordLength = password.length();
    String pin_fmt = StringUtils.rightPad("0" + passwordLength + password, 16, "F");
    byte[] pinBLOCK = DumpUtils.hexToBytes(pin_fmt);
    System.out.println("无主帐号pinBlock:" + Dump.getHexDump(pinBLOCK));

    byte[] des3Info = DesUtils.tripDesEncrypt(pinBLOCK, pinKey);
    return DumpUtils.bytesToHex(des3Info);
  }
  /**
   * 1:ANSI X9.8 Format(带主账号)
   *
   * @param password
   * @param pinKey
   * @param pan
   * @return
   * @throws Exception
   */
  public static String pinEncode(String password, byte[] pinKey, String pan) throws Exception {
    int passwordLength = password.length();
    int panLength = pan.length();
    String pin_fmt = StringUtils.rightPad("0" + passwordLength + password, 16, "F");
    byte[] pinBLOCK = DumpUtils.hexToBytes(pin_fmt);
    String pin_str = "0000" + pan.substring(3, 15);
    System.out.println("pinBlock:" + pin_str);
    byte[] panByte = DumpUtils.hexToBytes(pin_str);
    for (int i = 0; i < panByte.length; i++) {
      pinBLOCK[i] ^= panByte[i];
    }
    System.out.println("有主帐号pinBlock:" + Dump.getHexDump(pinBLOCK));

    byte[] des3Info = DesUtils.tripDesEncrypt(pinBLOCK, pinKey);
    return DumpUtils.bytesToHex(des3Info);
  }
  /**
   * 银行卡密码加密,先进行与主账号异或后进行3DES加密
   *
   * @param pin 银行卡密码
   * @param pan 银行卡号
   * @return
   */
  public static String getENPinBlock(String pin, String pan, byte[] pinKey) {
    String panStr = pan.substring(pan.length() - 12 - 1, pan.length() - 1);
    byte[] panBlock = new byte[8];
    System.arraycopy(CodecUtils.hex2byte(panStr), 0, panBlock, 2, 6);

    String pinLen = pin.length() + "";
    String pinStr = StringUtils.rightPad(pin, 14, 'F');
    byte[] pinBlock = new byte[8];
    System.arraycopy(CodecUtils.hex2byte(pinLen), 0, pinBlock, 0, 1);
    System.arraycopy(CodecUtils.hex2byte(pinStr), 0, pinBlock, 1, 7);

    for (int i = 0; i < panBlock.length; i++) {
      pinBlock[i] ^= panBlock[i];
    }
    byte[] des3Info = DesUtils.tripDesEncrypt(panBlock, pinKey);
    return DumpUtils.bytesToHex(des3Info);
  }