ANSI X9.8

  (1) ANSI X9.8 Format(不带主账号信息

      位置                  长度                              说明

       1                      1byte                          PIN的长度

       2                      7byte                         6-12位PIN(每个字符占4个BIT,不足8位右补F)

例如:明文PIN为 123456,

则PIN BLOCK为 0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF

 

(2)ANSI X9.8 Format(带主帐号信息
PIN BLOCK 格式:等于 PIN 按位异或主帐号
PIN 格式:
BYTE 1 PIN的长度
BYTE 2 – BYTE 3/4/5/6/7   4--12个PIN(每个PIN占4个BIT)
BYTE 4/5/6/7/8 – BYTE 8   FILLER “F” (每个“F“占4个BIT)

主帐号格式:
BYTE 1 — BYTE 2   0X0000
BYTE 3 — BYTE 8   12个主帐号
12位主帐号的取法:取主帐号的右12位(不包括最右边的校验位),不足12位左补“0X00 ”。


例如:明文 PIN 123456,
设:磁卡上的主帐号为:123456789012345678
截取下的主帐号为:678901234567

则用于PIN加密的主帐号为:0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67
则 PIN BLOCK 为 :   

                                 0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF
        异或                  0x00 0x00 0x67 0x89 0x01 0x23 0x45 0x67
      结果为                0x06 0x12 0x53 0xDF 0xFE 0xDC 0xBA 0x98

设:磁卡上的主帐号为:1234567890123456
截取下的主帐号为:456789012345
则用于PIN加密的主帐号为:0x00 0x00 0x45 0x67 0x89 0x01 0x23 0x45
则 PIN BLOCK 为

                                0x06 0x12 0x34 0x56 0xFF 0xFF 0xFF 0xFF
       异或                  0x00 0x00 0x45 0x67 0x89 0x01 0x23 0x45
      结果为               0x06 0x12 0x71 0x31 0x76 0xFE 0xDC 0xBA


PIN 加密解密
省中心(外围系统)在发送消息给全国中心(省中心)之前,应用本中心的PIK对PIN加密后发往全国中心(省中心)。


/**
   * getPinBlock
   * 标准ANSI X9.8 Format(带主帐号信息)的PIN BLOCK计算
   * PIN BLOCK 格式等于 PIN 按位异或 主帐号;
   * @param pin String
   * @param accno String
   * @return byte[]
   */

private byte[] process(String pin, String accno) {
    byte arrAccno[] = getHAccno(accno);
    byte arrPin[] = getHPin(pin);
    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;
}

/**
   * getHPin
   * 对密码进行转换
   * PIN格式
   * BYTE 1 PIN的长度
   * BYTE 2 – BYTE 3/4/5/6/7   4--12个PIN(每个PIN占4个BIT)
   * BYTE 4/5/6/7/8 – BYTE 8   FILLER “F” (每个“F“占4个BIT)
   * @param pin String
   * @return byte[]
   */

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;
}

/**
   * getHAccno
   * 对帐号进行转换
   * BYTE 1 — BYTE 2 0X0000
   * BYTE 3 — BYTE 8 12个主帐号
   * 取主帐号的右12位(不包括最右边的校验位),不足12位左补“0X00”。
   * @param accno String
   * @return byte[]
   */

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;
}

内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值