安全报文是使用加密和/或附加消息鉴别码对敏感指令进行保护的机制。安全报文包括“明文+MAC”和“密文+MAC”两种方式。
智能密码钥匙的安全报文机制如下。
假定分组长度为L,待加密数据长度为Ld(最大长度为65553)。
数据加密运算:
第一步:在待加密数据前填充两字节的数据长度(以Little Endian方式表示),作为加密过程的输入数据。
第二步:将经第一步处理后的数据块分为L字节是单位的数据块,标识成D1,D2,……,Dn等。
第三步:如果最后一组数据块长度为L字节,必须在后加上1字节0x80及L-1字节0x00转到第四步;若最后一组数据块长度不够L字节,那么在后加上0x80,若长度达到L字节,转至第四步;要不然在其后再加上0x00,直至长度达到L字节。
第四步:对上述每个数据块使用相应的密钥进行加密运算。
第五步:计算结束后,把全部运算后的数据块按原有顺序连接到一起,即为加密运算后结果。
数据解密运算:
第一步:对待解密数据按L字节进行分组。
第二步:对每个分组使用相应的密码进行解密运算,所有解密后的数据按照原有序列连接到一起。
第三步:去掉前面填充的数据长度和最后的填充数据,得到原始明文。
MAC计算:
MAC是使用命令的全部元素产生的,MAC为命令数据域中一部分,长度为4字。
MAC计算步骤如下:
第一步:应用向智能密码钥匙发送取随机数指令,从智能密码钥匙取回8字节随机数。
第二步:将智能密码钥匙回送的8字节随机数加上L-8个字节0x00,得到L字节结果作为初始值。
第三步:按顺序把这些数据连成数据块:CLA、INS、P1、P2、Lc+4、Data。把CLA的低半字节。
第四步:将数据块分为L字节成单位的数据块,标识成D1,D2,…,Dn等。
第五步:如果最后一组数据块长度为L字节,必须在后加上1字节0x80及L-1字节0x00,转到第六步;若最后一组数据块长度不足L字节,则在后加上0x80,若长度达到L字节,转到第六步;要不然在其后再加上0x00,直至长度达到L字节。
第六步:对上述数据块用相应的密钥加密。
第七步:将上述加密得到的结果从左侧取4字节长度数据为MAC。