0

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

我使用 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“主机”应用程序

汉语水平考试

4

1 回答 1

1

填充

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

加密

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

该算法需要两个 8 字节密钥并执行如下定义的 3DES。请注意,这是我对算法的理解(我的头脑);请阅读正式规格以获得“正确”的理解:

  1. 首先做所需的填充
  2. 使用 0 的初始化向量(全为零)
  3. 使用第一个密钥链接和加密 8 位块(如在单个 DES 中)
  4. 最后一个区块需要一个 3DES 应用程序;因此使用第二个密钥解密并再次使用第一个密钥对其进行加密
于 2011-08-11T10:43:26.353 回答