• 加密算法


    十六进制字符串转化为字符算法

    例如十六进制字符串为: 138CE5B32C0E9126C291E970EA98764C

    那么,两位十六进制合成一个字符:13(hex)->1*16+3=19,那么字符的整数形式则为19

    字符转化为十六进制字符串

    例如字符的整数形式为17->17/16,17%16->11(hex)

    主密钥:

    主密钥是有三组分量的,一个分量为8位,则主密钥的长度为24位

    但是目前机端只支持两组分量,那么密钥的第三个分量则使用第一个分量的值来合成24位的密钥(名称为3des双倍长)

    明文分量1 :138CE5B32C0E9126C291E970EA98764C

    明文分量2 :1FD3C2437F6EE6DCD9383E1A49E9674C

    成份1校验值:FA16CB

    成份2校验值:906256

    合成后校验值:9BAE3E

    加密后的主密钥:  C24CC457EEA2ACB556DB514BFF15AE0B

    主密钥明文 =  明文分量1 异或  明文分量2 

    根据上面的数据,主密钥明文为0C5F27F0536077FA1BA9D76AA3711100

    工作密钥

    Pinkey

    Pinkey是用来对pinblock进行加密的密钥

    我们得到的一般是pinkey的密文,是通过主密钥3des加密而成的,3des的加解密可以通过openssl库来实现.

    3des加解密函数: DES_ecb3_encrypt

    我们通过主密钥明文对pinkey密文进行3des解密,得到pinkey明文,然后拿着pinkey明文进行pinblock的运算

    Mackey

    Mackey是用来对macdata进行加密的密钥,具体加密过程,参见mac运算章节

    我们得到的是mackey的密文,是主密钥通过3des加密而成, 3des的加解密可以通过openssl库来实现.

    3des加解密函数: DES_ecb3_encrypt

    我们通过主密钥明文对mackey密文进行3des解密,得到mackey明文,然后拿着mackey明文进行mac运算

    Pinblock

    Pinblock是使用卡号和密码进行运算得到的一串字符.

    首先压缩密码:

    例如密码为123456

    压缩成8位字符串

    0->6     //密码位数

    1->18    //密码第一位1*16加上密码第二位2 ->1*16+2=18

    2->52    //密码第三位3*16加上密码第四位4 ->3*16+4=52

    3->86    //密码第五位5*16加上密码第六位6 ->5*16+6=86

    4->255   //固定值

    5->255   //固定值

    6->255   //固定值

    7->255   //固定值

    得到密码8位串PASSWORD_STR:

    6

    18

    52

    86

    255

    255

    255

    255

    对帐号进行转换:

    取帐号右12位(不包括最后一位校验位),不足12位右补0x00,然后对12位进行压缩成8位字符串

    例如帐号为00123456789012

    压缩成8位字符串

    0->0    //固定为0

    1->0    //固定为0

    2->18   //第一位1*16加上第二位2 ->1*16+2=18

    3->52   //第三位3*16加上第四位4 ->3*16+4=52

    4->86   //……

    5->120  //……

    6->144  //……

    7->18   //……

    得到帐号8位串ACCOUNTNO_STR

    0

    0

    18

    52

    86

    120

    144

    18

    得到pinblock明文

    对ACCOUNTNO_STR异或PASSWORD_STR

    PASSWORD_STR

    6

    18

    52

    86

    255

    255

    255

    255

    ACCOUNTNO_STR

    0

    0

    18

    52

    86

    120

    144

    18

    pinblock明文

    6

    18

    53

    117

    186

    152

    118

    254

    得到pinblock明文: 06123575BA9876FE

    得到pinblock密文

    对pinblock明文使用pinkey明文通过3des加密,最终得到pinblock密文

    Mac运算

    mac是通过mackey明文使用ANSIX9.19加密生成的

    ANSIX9.19算法

    密钥长度为32位(hex格式)

    程序得到macdata串,如果macdata串长度不为8的倍数,则右补0x00,补够8的倍数

    设置初始向量E0= x00x00x00x00x00x00x00x00(八位0)

    把macdata串分成每组8位:D1,D2,D3……DN

    使用向量跟macdata的八位串进行异或E0^D1->F-->使用密钥左16位进行DES加密-->E1

    E1^D2----->E2

    …….

    E(N-1)^DN---->EN

    使用密钥右16位对EN进行DES解密,得到En0

    使用密钥左16位对EN进行DES加密,得到En1

    En1为最终的mac

    des加解密函数: DES_ecb_encrypt

     

  • 相关阅读:
    Unity3D 学习笔记
    Python中os和sys模块
    合并两个排序的链表
    反转链表 难
    链表中倒数第k个结点
    调整数组顺序使奇数在偶数前 14
    javascript中this详解
    静态方法实例方法
    强制类型转换
    javascript类型判断方法
  • 原文地址:https://www.cnblogs.com/kukafeiso/p/3798606.html
Copyright © 2020-2023  润新知