我希望你们中的一些人能在这个问题上帮助我。
我使用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机制“签名”数据,并使用ISO9797填充方法2(我认为这被称为“位填充”)将加密数据传递给密码数据。
有人能帮助我创建/解释DES_MAC_EMV机制和ISO9797填充方法2的Java等价物吗?
感谢你的帮助
正如我忘记提到的那样,我正在创建一个连接到电子护照并提取数据的系统。此时,我正在验证从SmartCardShell程序/javascript代码中获得的数据。这不是一个javacard applet/应用程序,它只是一个Java“主机”应用程序。
HSK
发布于 2011-08-11 10:43:26
填充
填充物其实很简单。有些地方称ISO 9797-1的填充方法2为位填充.基本上,在末尾添加一个0x80字节,然后追加足够数量的0x00,这样消息的总长度是8的倍数。
加密
DES_MAC_EMV在上述代码中更正式地命名为ISO 9797-1算法3.一些文章/网站也将其称为零售MAC算法。
该算法需要两个8字节的密钥,并执行如下所定义的3 3DES。请注意,这是我对算法的理解(非头脑中的);请阅读正式规范以获得“正确”的理解:
G 211)加密它
https://stackoverflow.com/questions/6966419
复制相似问题