首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISO 9797填充方法2及java中MAC的生成

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

Stack Overflow用户
提问于 2011-08-06 11:12:18
回答 1查看 5.7K关注 0票数 0

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

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

我正试图在java中为我的论文复制代码。然而,我对MAC一代感到困惑。

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

代码语言: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密钥,它是通过以下方式完成的:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2011-08-11 10:43:26

填充

填充物其实很简单。有些地方称ISO 9797-1的填充方法2为位填充.基本上,在末尾添加一个0x80字节,然后追加足够数量的0x00,这样消息的总长度是8的倍数。

加密

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

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

  1. 首先使用0(全零)
  2. 链进行所需的填充
  3. ,然后使用第一个密钥(如单个DES)
  4. 加密8位块,最后一个块需要一个3 DES应用程序;因此,使用第二个密钥解密,再用第一个密钥(

G 211)加密它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6966419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档