在 ICAO 9303 "worked examples" Java/Clojure 中重新创建 MAC 电子护照问题
ePassport Problems reagrding MAC creation in ICAO 9303 "worked examples" in Java/Clojure
我正在开发一个需要从 epassports 读取数据的应用程序。
我正在研究 ICAO Doc 9303 第 3 部分第 2 卷(第三版)中的 "worked examples"。
工作示例中有一个部分,他们将 MUTAUAL_AUTHENTICATE apdu 放在一起。它涉及计算 "72C29C2371CC9BDB65B779B8E8D37B29ECC154AA56A8799FAE2F498F76ED92F2"
的 MAC
使用键 "7962D9ECE03D1ACD4C76089DCE131543"
等于 "5F1448EEA8AD90A7"
。
因此,我使用 BouncyCastle 将执行计算的代码放在一起,以便它与文档内联。
但是在第 "Secure Messaging" 部分中 "887022120C06C2270CA4020C800000008709016375432908C044F68000000000"
的 MAC 键为 "F1CB1F1FB5ADF208806B89DC579DC1F8"
。这应该等于 "BF8B92D635FF24F8"
,但使用与前一个示例完全相同的代码,我在这里得到不同的结果。 ("582AFC932A87F378"
)
怎么可能?他们是否改变了 MAC 在 MUTAUAL_AUTHENTICATE 和 Secure Messaging 中的创建方式?我在文档中找不到任何相关内容。
这是我的代码,我使用的是 clojure,但所有工作都是在 BouncyCastle 中完成的 (Java)
(defn gen-mac [key message]
(let [engine (org.bouncycastle.crypto.engines.DESEngine.)
mac (org.bouncycastle.crypto.macs.ISO9797Alg3Mac. engine (org.bouncycastle.crypto.paddings.ISO7816d4Padding.))
bytes (byte-array (.getMacSize mac))
key (->bytes key)
msg (->bytes message)]
(.init mac (org.bouncycastle.crypto.params.DESedeParameters. key))
(.update mac msg 0 (count msg))
(.doFinal mac bytes 0)))
在java中大致翻译成这样:
mac = org.bouncycastle.crypto.macs.ISO9797Alg3Mac(org.bouncycastle.crypto.engines.DESEngine(), org.bouncycastle.crypto.paddings.ISO7816d4Padding());
mac.init(org.bouncycastle.crypto.params.DESedeParameters(key));
mac.update(msg, 0, msg.length);
mac.doFinal(bytes, 0)
编辑:
这就是文档所说的:
f. Compute MAC of M:
i. Increment SSC with 1:
SSC = ‘887022120C06C227’
ii. Concatenate SSC and M and add padding:
N = ‘887022120C06C2270CA4020C800000008709016375432908C044F68000000000’
iii. Compute MAC over N with KSMAC:
CC = ‘BF8B92D635FF24F8’
他们还提供了一个图表,也没有使它更清楚。
正如下面正确指出的那样。这里的关键是计算 MAC 超过
N' = ‘887022120C06C2270CA4020C800000008709016375432908C044F6
我认为他们的文档非常好,但目前还不清楚。我自己永远也想不出来。
@sainaen:作为跟进,你是怎么做到的?
不,对于安全消息他们使用相同的算法,只是他们没有在 MuthualAuth 示例中显式填充数据(因为它已经达到要求的长度)并在 SM 示例中这样做。
尝试使用您的 "887022120C06C2270CA4020C800000008709016375432908C044F6"
代码(这是一个没有填充的 SSC + M)计算 MAC,您将得到预期的 "BF8B92D635FF24F8"
.
我正在开发一个需要从 epassports 读取数据的应用程序。 我正在研究 ICAO Doc 9303 第 3 部分第 2 卷(第三版)中的 "worked examples"。
工作示例中有一个部分,他们将 MUTAUAL_AUTHENTICATE apdu 放在一起。它涉及计算 "72C29C2371CC9BDB65B779B8E8D37B29ECC154AA56A8799FAE2F498F76ED92F2"
的 MAC
使用键 "7962D9ECE03D1ACD4C76089DCE131543"
等于 "5F1448EEA8AD90A7"
。
因此,我使用 BouncyCastle 将执行计算的代码放在一起,以便它与文档内联。
但是在第 "Secure Messaging" 部分中 "887022120C06C2270CA4020C800000008709016375432908C044F68000000000"
的 MAC 键为 "F1CB1F1FB5ADF208806B89DC579DC1F8"
。这应该等于 "BF8B92D635FF24F8"
,但使用与前一个示例完全相同的代码,我在这里得到不同的结果。 ("582AFC932A87F378"
)
怎么可能?他们是否改变了 MAC 在 MUTAUAL_AUTHENTICATE 和 Secure Messaging 中的创建方式?我在文档中找不到任何相关内容。
这是我的代码,我使用的是 clojure,但所有工作都是在 BouncyCastle 中完成的 (Java)
(defn gen-mac [key message]
(let [engine (org.bouncycastle.crypto.engines.DESEngine.)
mac (org.bouncycastle.crypto.macs.ISO9797Alg3Mac. engine (org.bouncycastle.crypto.paddings.ISO7816d4Padding.))
bytes (byte-array (.getMacSize mac))
key (->bytes key)
msg (->bytes message)]
(.init mac (org.bouncycastle.crypto.params.DESedeParameters. key))
(.update mac msg 0 (count msg))
(.doFinal mac bytes 0)))
在java中大致翻译成这样:
mac = org.bouncycastle.crypto.macs.ISO9797Alg3Mac(org.bouncycastle.crypto.engines.DESEngine(), org.bouncycastle.crypto.paddings.ISO7816d4Padding());
mac.init(org.bouncycastle.crypto.params.DESedeParameters(key));
mac.update(msg, 0, msg.length);
mac.doFinal(bytes, 0)
编辑: 这就是文档所说的:
f. Compute MAC of M:
i. Increment SSC with 1: SSC = ‘887022120C06C227’
ii. Concatenate SSC and M and add padding: N = ‘887022120C06C2270CA4020C800000008709016375432908C044F68000000000’
iii. Compute MAC over N with KSMAC: CC = ‘BF8B92D635FF24F8’
他们还提供了一个图表,也没有使它更清楚。 正如下面正确指出的那样。这里的关键是计算 MAC 超过
N' = ‘887022120C06C2270CA4020C800000008709016375432908C044F6
我认为他们的文档非常好,但目前还不清楚。我自己永远也想不出来。
@sainaen:作为跟进,你是怎么做到的?
不,对于安全消息他们使用相同的算法,只是他们没有在 MuthualAuth 示例中显式填充数据(因为它已经达到要求的长度)并在 SM 示例中这样做。
尝试使用您的 "887022120C06C2270CA4020C800000008709016375432908C044F6"
代码(这是一个没有填充的 SSC + M)计算 MAC,您将得到预期的 "BF8B92D635FF24F8"
.