edep 初始化圈存,圈存流程、数据计算与示例

初始化圈存与圈存

涉及密钥

涉及DLK,DTK两个密钥

下面例子中
DLK为  70 6D 06 71 BB 8B D2 8B D3 D6 E8 83 68 32 FD D4
DTK为  47 9E 71 BE FF 10 7A 76 13 8D 34 F8 4B 20 31 FF

要执行圈存,必要的选文件,校验pin之类的是要先执行的。


// Reset--Card Status:The card has been reset and specific  communication protocols  have been established.

//
reset
3B 88 80 01 44 31 31 43 52 32 2E 30 70 

//
Select File                           (defined by ISO/IEC 7816-4)
00 A4 04 00 09  A0 00 00 00 03 86 98 07 02 
6F 32 84 09 A0 00 00 00 03 86 98 07 02 A5 25 9F 08 01 02 9F 0C 1E 63 64 00 22 33 33 00 02 03 01 00 05 20 00 08 17 00 00 00 01 20 00 01 01 20 10 12 31 88 99 
90 00 

//
Verify                                (defined by ISO/IEC 7816-4)
00 20 00 00 02  12 34 
90 00 

//
Get Balance                                     (defined by PBOC)
80 5C 00 01 04 
00 00 00 24 
90 00 

//
Get Balance                                     (defined by PBOC)
80 5C 00 02 04 
00 00 00 00 

90 00 


下面圈存0x10单位,一般这个单位是分

// 8050   00   01   (   01   00000010   112233445566   )  
//-----
Final result ---  80 50 00 01 0B 01 00 00 00 10 11 22 33 44 55 66 
//

//
clear_fifo   (   )  
//--
clear_fifo clear all fifo data
//

//-----
Final result --- 
//

//
apdu   (   80   50   00   01   0B   01   00   00   00   10   11   22   33   44   55   66   )  
//--
send =  80 50 00 01 0B 01 00 00 00 10 11 22 33 44 55 66 

//
INITIALIZE FOR LOAD(圈存初始化)                 (defined by EDEP)
80 50 00 01 0B  01 00 00 00 10 11 22 33 44 55 66 
00 00 00 24 00 06 01 00 C4 7D EB 1F 54 B5 E4 81 
90 00 
//-----
Final result --- 
//

//
read_fifo   (   )  
//--
read_fifo get first data from fifo
//--
  output =  00 00 00 24 00 06 01 00 C4 7D EB 1F 54 B5 E4 81 
//

//-----
Final result ---  00 00 00 24 00 06 01 00 C4 7D EB 1F 54 B5 E4 81 

将计算结果进行分割

余额

// mid   (   00   00   00   24   00   06   01   00   C4   7D   EB   1F   54   B5   E4   81   ,   int   (   0   )   ,   int   (   4   )   )  
//----
int
//----
  input =  00   hex =  00 00 00 00 
//

//----
int
//----
  input =  04   hex =  00 00 00 04 
//

//--
mid returns a specified number data from input data
//--
  input =  00 00 00 24 00 06 01 00 C4 7D EB 1F 54 B5 E4 81 
//--
  offset =  00 00 00 00 
//--
  length =  00 00 00 04 
//--
  output =  00 00 00 24 
//

//-----
Final result ---  00 00 00 24 


序列号

// mid   (   00   00   00   24   00   06   01   00   C4   7D   EB   1F   54   B5   E4   81   ,   int   (   4   )   ,   int   (   2   )   )  
//----
int
//----
  input =  04   hex =  00 00 00 04 
//

//----
int
//----
  input =  02   hex =  00 00 00 02 
//

//--
mid returns a specified number data from input data
//--
  input =  00 00 00 24 00 06 01 00 C4 7D EB 1F 54 B5 E4 81 
//--
  offset =  00 00 00 04 
//--
  length =  00 00 00 02 
//--
  output =  00 06 
//

//-----
Final result ---  00 06 


伪随机数

// mid   (   00   00   00   24   00   06   01   00   C4   7D   EB   1F   54   B5   E4   81   ,   int   (   8   )   ,   int   (   4   )   )  
//----
int
//----
  input =  08   hex =  00 00 00 08 
//

//----
int
//----
  input =  04   hex =  00 00 00 04 
//

//--
mid returns a specified number data from input data
//--
  input =  00 00 00 24 00 06 01 00 C4 7D EB 1F 54 B5 E4 81 
//--
  offset =  00 00 00 08 
//--
  length =  00 00 00 04 
//--
  output =  C4 7D EB 1F 
//

//-----
Final result ---  C4 7D EB 1F 


MAC1

// mid   (   00   00   00   24   00   06   01   00   C4   7D   EB   1F   54   B5   E4   81   ,   int   (   12   )   ,   int   (   4   )   )  
//----
int
//----
  input =  12   hex =  00 00 00 0C 
//

//----
int
//----
  input =  04   hex =  00 00 00 04 
//

//--
mid returns a specified number data from input data
//--
  input =  00 00 00 24 00 06 01 00 C4 7D EB 1F 54 B5 E4 81 
//--
  offset =  00 00 00 0C 
//--
  length =  00 00 00 04 
//--
  output =  54 B5 E4 81 
//

//-----
Final result ---  54 B5 E4 81 


进行验证

计算过程密钥

// C4   7D   EB   1F   00   06   8000  
//-----
Final result ---  C4 7D EB 1F 00 06 80 00 
//

//
3des_encode_ecb   (   C4   7D   EB   1F   00   06   80   00   ,   70   6D   06   71   BB   8B   D2   8B   D3   D6   E8   83   68   32   FD   D4   )  
//--
triple des ecb encrypt
//--
key =  70 6D 06 71 BB 8B D2 8B D3 D6 E8 83 68 32 FD D4 
//--
plain =  C4 7D EB 1F 00 06 80 00    cipher =  66 BF BA 7A E8 98 CC D8 
//

//-----
Final result ---  66 BF BA 7A E8 98 CC D8 

计算MAC1


// fixed80   (   00   00   00   24   00000010   01   112233445566   )  
//--
fixed80 fixed fill 80 00 ... after the data to multiple of 8
//--
  input =  00 00 00 24 00 00 00 10 01 11 22 33 44 55 66 
//--
  output =  00 00 00 24 00 00 00 10 01 11 22 33 44 55 66 80 
//

//-----
Final result ---  00 00 00 24 00 00 00 10 01 11 22 33 44 55 66 80 
//

//
des_des_mac   (   0000000000000000   ,   00   00   00   24   00   00   00   10   01   11   22   33   44   55   66   80   ,   66   BF   BA   7A   E8   98   CC   D8   )  
//--
des_des_mac
//--
key =  66 BF BA 7A E8 98 CC D8 
//--
icv =  00 00 00 00 00 00 00 00    plain =  00 00 00 24 00 00 00 10 
//--
xor =  00 00 00 24 00 00 00 10    cipher =  68 2A 53 DB A2 0B C2 DA 
//--
icv =  68 2A 53 DB A2 0B C2 DA    plain =  01 11 22 33 44 55 66 80 
//--
xor =  69 3B 71 E8 E6 5E A4 5A    cipher =  54 B5 E4 81 EF E5 06 12 
//

//-----
Final result ---  54 B5 E4 81 


计算圈存指令,主要就是计算MAC2

// fixed80   (   00000010   01   112233445566   20140624111111   )  
//--
fixed80 fixed fill 80 00 ... after the data to multiple of 8
//--
  input =  00 00 00 10 01 11 22 33 44 55 66 20 14 06 24 11  11 11 
//--
  output =  00 00 00 10 01 11 22 33 44 55 66 20 14 06 24 11  11 11 80 00 00 00 00 00 
//

//-----
Final result ---  00 00 00 10 01 11 22 33 44 55 66 20 14 06 24 11 11 11 80 00 00 00 00 00 
//

//
des_des_mac   (   0000000000000000   ,   00   00   00   10   01   11   22   33   44   55   66   20   14   06   24   11   11   11   80   00   00   00   00   00   ,   66   BF   BA   7A   E8   98   CC   D8   )  
//--
des_des_mac
//--
key =  66 BF BA 7A E8 98 CC D8 
//--
icv =  00 00 00 00 00 00 00 00    plain =  00 00 00 10 01 11 22 33 
//--
xor =  00 00 00 10 01 11 22 33    cipher =  D8 9C 25 41 43 FE C4 FA 
//--
icv =  D8 9C 25 41 43 FE C4 FA    plain =  44 55 66 20 14 06 24 11 
//--
xor =  9C C9 43 61 57 F8 E0 EB    cipher =  8E CA D3 59 0F 6A B9 05 
//--
icv =  8E CA D3 59 0F 6A B9 05    plain =  11 11 80 00 00 00 00 00 
//--
xor =  9F DB 53 59 0F 6A B9 05    cipher =  50 D4 04 B0 B9 F7 7B D1 
//

//-----
Final result ---  50 D4 04 B0 
//

//
8052   00   00   (   20140624111111   50   D4   04   B0   )  
//-----
Final result ---  80 52 00 00 0B 20 14 06 24 11 11 11 50 D4 04 B0 
//

//
clear_fifo   (   )  
//--
clear_fifo clear all fifo data
//

//-----
Final result --- 
//

//
apdu   (   80   52   00   00   0B   20   14   06   24   11   11   11   50   D4   04   B0   )  
//--
send =  80 52 00 00 0B 20 14 06 24 11 11 11 50 D4 04 B0 


执行圈存指令

// CREDIT FOR LOAD(圈存)                          (defined by EDEP)
80 52 00 00 0B  20 14 06 24 11 11 11 50 D4 04 B0 
CF 77 7F 5F 
90 00 
//-----
Final result --- 
//

//
read_fifo   (   )  
//--
read_fifo get first data from fifo
//--
  output =  CF 77 7F 5F 
//

//-----
Final result ---  CF 77 7F 5F 


计算TAC

// fixed80   (   add   (   00   00   00   24   ,   00000010   )   00   06   00000010   01   112233445566   20140624111111   )  
//----
add calculate num1 + num2
//----
  num1 =  00 00 00 24 
//----
  num3 =  00 00 00 10 
//----
  result =  00 00 00 34 
//

//--
fixed80 fixed fill 80 00 ... after the data to multiple of 8
//--
  input =  00 00 00 34 00 06 00 00 00 10 01 11 22 33 44 55  66 20 14 06 24 11 11 11 
//--
  output =  00 00 00 34 00 06 00 00 00 10 01 11 22 33 44 55  66 20 14 06 24 11 11 11 80 00 00 00 00 00 00 00 
//

//-----
Final result ---  00 00 00 34 00 06 00 00 00 10 01 11 22 33 44 55 66 20 14 06 24 11 11 11 80 00 00 00 00 00 00 00 
//

//
xor   (   left   (   47   9E   71   BE   FF   10   7A   76   13   8D   34   F8   4B   20   31   FF   ,   08   )   ,   right   (   47   9E   71   BE   FF   10   7A   76   13   8D   34   F8   4B   20   31   FF   ,   08   )   )  
//----
left returns a specified number data from input data left side
//----
  input =  47 9E 71 BE FF 10 7A 76 13 8D 34 F8 4B 20 31 FF 
//----
  length =  08 
//----
  output =  47 9E 71 BE FF 10 7A 76 
//

//----
right returns a specified number data from input data right side
//----
  input =  47 9E 71 BE FF 10 7A 76 13 8D 34 F8 4B 20 31 FF 
//----
  length =  08 
//----
  output =  13 8D 34 F8 4B 20 31 FF 
//

//--
xor_whole XOR data 1 to data 2, the returned data length is the length of the data 2
//--
  data 1 =  47 9E 71 BE FF 10 7A 76 
//--
  data 2 =  13 8D 34 F8 4B 20 31 FF 
//--
  result =  54 13 45 46 B4 30 4B 89 
//

//-----
Final result ---  54 13 45 46 B4 30 4B 89 
//

//
des_des_mac   (   0000000000000000   ,   00   00   00   34   00   06   00   00   00   10   01   11   22   33   44   55   66   20   14   06   24   11   11   11   80   00   00   00   00   00   00   00   ,   54   13   45   46   B4   30   4B   89   )  
//--
des_des_mac
//--
key =  54 13 45 46 B4 30 4B 89 
//--
icv =  00 00 00 00 00 00 00 00    plain =  00 00 00 34 00 06 00 00 
//--
xor =  00 00 00 34 00 06 00 00    cipher =  5C 66 5D F5 06 9E 92 D2 
//--
icv =  5C 66 5D F5 06 9E 92 D2    plain =  00 10 01 11 22 33 44 55 
//--
xor =  5C 76 5C E4 24 AD D6 87    cipher =  6A 53 15 2F 0B BB D3 DC 
//--
icv =  6A 53 15 2F 0B BB D3 DC    plain =  66 20 14 06 24 11 11 11 
//--
xor =  0C 73 01 29 2F AA C2 CD    cipher =  E8 CD E0 11 56 28 2C 9F 
//--
icv =  E8 CD E0 11 56 28 2C 9F    plain =  80 00 00 00 00 00 00 00 
//--
xor =  68 CD E0 11 56 28 2C 9F    cipher =  CF 77 7F 5F FC 78 51 FF 
//

//-----
Final result ---  CF 77 7F 5F 
//

你可能感兴趣的:(smart)