流程与指令
1.取随机数
对象:用户卡(CPU卡)
指令:0084000004(取四字节伪随机数)
目的:取用户卡的四字节随机数,补位四字节“00”后,八字节作为MAC计算的初始化向量
2.DES计算初始化
对象:PSAM卡(初始化PSAM卡DES/MAC计算接口)
指令:80 1A+密钥类型+密钥版本+数据域长度+待加密数据(实质为分散因子)
目的:初始化PSAM卡的DES/MAC计算接口,并告诉PSAM卡,我的分散因子是什么,我要分散几级,方便后续的MAC计算
3.MAC(DES)计算
对象:PSAM卡(实际计算过程)
指令:80 FA+05 00(05含义为“唯一一块MAC计算”)+数据域长度+待加密数据(组成为8字节初始化向量+更新数据指令的全部,注意使用80规则补正为8字节的整数倍)
目的:实际计算出待加密数据的四字节MAC,供下一步调用
4.更新数据
对象:用户卡(CPU卡)
指令:04 D6+文件地址+偏移量(例:更新05文件,从第五字节开始更新,就是04 D6 85 05)+数据域长度+待更新数据
该指令返回成功后,更新二进制文件的数据即完成
MAC计算方面的坑
1.DES初始化那一步的分散因子和密钥类型特别容易取错,一定记得反复核对和从CPU卡里取出来的是否一样
2.MAC计算头四个是不变的,80 FA 05 00,后续长度记得加上8字节的初始化向量,以及04D6后的长度提前补上4字节MAC的长度
3.关于MAC计算后数据域的80补正:80 FA指令的全部数据域长度应该为8的整数倍。若不是,则在最后首位加上80,然后是00,00,00…,补正到8的整数倍为止;若一开始即为8的整数倍,则加上80,00,00…补正到下一个8的整数倍。此步骤可称为“fixed80”操作
4.最后二进制文件更新命令的“04 D6”代表带线路保护的更新,参数P2偏移量是十六进制Hex,不是十进制,当时被这个坑了好久,一直给我报“6700—长度不对”错误