ISO 9797填充方法2和java中的MAC生成

时间:2011-08-06 11:12:18

标签: java macos des 3des

我希望你们中的一些人能够在这个问题上帮助我。

我使用SmartCardShell程序运行一个javascript代码,从英国电子护照中提取数据。

我正在尝试在我的论文中复制java中的代码。但是我对MAC一代感到难过。

数据加密和MAC生成的javascript代码是:

var cryptogram = crypto.encrypt(kenc, Crypto.DES_CBC, plain, new ByteString("0000000000000000", HEX));
print("Cryptogram   : " + cryptogram);'

var mac = crypto.sign(kmac, Crypto.DES_MAC_EMV, cryptogram.pad(Crypto.ISO9797_METHOD_2));
print("MAC          : " + mac);

我设法正确验证我的加密密钥(Kenc)是否正确生成。

关闭脚本代码,MAC密钥(Kmac)也是一个三重DES密钥,通过以下方式完成:

byte[] kmackey = new byte[24];
System.arraycopy(kmac, 0, kmackey, 0, kmac.length);
System.arraycopy(kmac, 0, kmackey, kmac.length, 8);
System.out.println("kmackey = " + ConvertToHex.convertToHex(kmackey));

DESedeKeySpec desedekey = new DESedeKeySpec(kmackey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
Key KMac = keyFactory.generateSecret(desedekey);

如上所示,javascript代码使用Kmac密钥“签署”数据,DES_MAC_EMV机制并使用ISO 9797填充方法2填充密码数据 - 我认为这称为“位填充”。

任何人都可以帮我创建/解释Java等效的DES_MAC_EMV机制和ISO 9797填充方法2吗?

感谢帮助

只是添加,因为我忘记提及它,我正在创建一个连接到电子护照并提取数据的系统。在那一刻,我正在验证从SmartCardShell程序/ javascript代码中获取的数据。这不是一个javacard applet /应用程序,它只是一个Java“主机”应用程序

HSK

1 个答案:

答案 0 :(得分:1)

填充

填充实际上非常简单。有些地方将ISO 9797-1的填充方法2称为位填充。您基本上在末尾添加一个0x80字节,然后附加足够数量的0x00,以便消息的总长度为8的倍数。

加密

以上代码中的DES_MAC_EMV更正式命名为 ISO 9797-1算法3 。一些文章/网站也将其称为零售MAC算法

此算法需要两个8字节密钥,并按照以下定义执行3DES。请注意,这是我对算法的理解(off-my-head);请阅读正式的规范以获得“正确”的理解:

  1. 首先进行必要的填充
  2. 使用0(全零)的初始化向量
  3. 使用第一个密钥链接和加密8位块(如 单个DES)
  4. 最后一块需要3DES应用程序;因此使用第二个密钥解密并再次使用第一个密钥对其进行加密