我希望你们中的一些人能够在这个问题上帮助我。
我使用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
答案 0 :(得分:1)
填充实际上非常简单。有些地方将ISO 9797-1的填充方法2称为位填充。您基本上在末尾添加一个0x80字节,然后附加足够数量的0x00,以便消息的总长度为8的倍数。
以上代码中的DES_MAC_EMV更正式命名为 ISO 9797-1算法3 。一些文章/网站也将其称为零售MAC算法。
此算法需要两个8字节密钥,并按照以下定义执行3DES。请注意,这是我对算法的理解(off-my-head);请阅读正式的规范以获得“正确”的理解: