ePassport 在 Java/Clojure 中的 ICAO 9303“工作示例”中重新创建 MAC 时出现问题

问题描述 投票:0回答:2

我正在开发一个需要从电子护照读取数据的应用程序。 我正在研究 ICAO Doc 9303 第 3 部分第 2 卷(第三版)中的“有效示例”。

工作示例中有一个部分,他们将 MUTAUAL_AUTHENTICATE apdu 放在一起。它涉及计算

"72C29C2371CC9BDB65B779B8E8D37B29ECC154AA56A8799FAE2F498F76ED92F2"
的 MAC 使用
"7962D9ECE03D1ACD4C76089DCE131543"
键,相当于
"5F1448EEA8AD90A7"
。 因此,我使用 BouncyCastle 将执行计算的代码放在一起,以便它与文档内联。

但是在“安全消息传递”部分中,

"887022120C06C2270CA4020C800000008709016375432908C044F68000000000"
的 MAC 与密钥
"F1CB1F1FB5ADF208806B89DC579DC1F8"
。这应该等于
"BF8B92D635FF24F8"
,但是使用与前一个示例完全相同的代码,我在这里得到了不同的结果。 (
"582AFC932A87F378"
)

怎么可能呢?它们是否改变了 MUTAUAL_AUTHENTICATE 和安全消息传递中 MAC 的创建方式?我在文档中找不到任何相关内容。

这是我的代码,我使用的是 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。计算 M 的 MAC:

我。将 SSC 增加 1: SSC=‘887022120C06C227’

ii.连接 SSC 和 M 并添加填充: N = ‘887022120C06C2270CA4020C800000008709016375432908C044F68000000000’

iii.使用 KSMAC 计算 N 上的 MAC: CC=‘BF8B92D635FF24F8’

他们还提供了一个图表,但也没有使它更清楚。 正如下面正确指出的那样。这里的关键是计算 MAC

N' = ‘887022120C06C2270CA4020C800000008709016375432908C044F6

我认为他们的文档非常好,但目前还不清楚。我自己永远也想不出来。

@sainaen:作为后续行动,你是如何做到这一点的?

java clojure bouncycastle
2个回答
3
投票

不,对于安全消息传递,他们使用相同的算法,只是他们没有在 MuthualAuth 示例中显式填充数据(因为它已经达到所需的长度)并在 SM 示例中执行此操作。

尝试使用您的代码

"887022120C06C2270CA4020C800000008709016375432908C044F6"
(这是一个没有填充的 SSC + M)来计算 MAC,您将得到预期的
"BF8B92D635FF24F8"


-1
投票

@sainaen 谢谢! 9年后,这对我帮助很大。 我已经尝试解决这个问题两天了!我只是想知道你是怎么找到这个的?它写在文档的某个地方吗?

© www.soinside.com 2019 - 2024. All rights reserved.