我希望你们中的一些人可以在这个问题上帮助我。
我使用 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 填充密码数据——我相信这称为“位填充”。
谁能帮助我创建/向我解释 DES_MAC_EMV 机制和 ISO 9797 填充方法 2 的 Java 等效项?
感谢帮助
只是补充一下,因为我忘了提到它,我正在创建一个系统来连接到电子护照并提取数据。此刻,我正在验证从 SmartCardShell 程序/javascript 代码中获得的数据。这不是 javacard 小程序/应用程序,它只是一个 Java“主机”应用程序
汉语水平考试