需要全球平台安全通道 2 计算示例

global platform secure channel 2 computation example needed

我正在为实现全球平台安全通道协议 2 的支付芯片编写个性化软件。我有芯片供应商提供的可以登录卡的工具,但我无法复制这些计算来得出我的自己的登录。供应商工具只有一个出厂密钥,或者可能是一个包含三个相同部分的密钥集。 vendor工具就知道这么多了,可以登录卡了:

cm> auth
=> 80 50 00 00 08 A0 13 2D 8B C1 E6 6E 9A 00          .P.....-...n..          host challenge:     A0132D8B C1E66E9A
(122317 usec)                       vv indicates SCP02
<= 00 00 00 00 00 00 00 00 00 00 FF 02 00 13 BA 2A    ...............*        seq num: 0013    card challenge:     BA2A16C9DC0E
   16 C9 DC 0E 30 11 F0 19 01 0D BF 2B 90 00          ....0......+..          card cryptogram:    3011F019 010DBF2B
 Status: No Error                                                               
 => 84 82 00 00 10 29 FD 73 3D 5A 91 6C 6F EA A6 56    .....).s=Z.lo..V        host cryptogram: 29FD733D5A916C6FEAA656B82A6B8928
   B8 2A 6B 89 28                                     .*k.(
(75647 usec)
<= 90 00                                              ..
Status: No Error

根据我对公开资料的阅读 Global Platform Card Specification,我的软件需要使用常量 182(或者可能是 181,我两种方法都试过了)和序列计数器(此处为“0013”),零-填充到 16 字节,以生成会话密钥。然后它需要连接主机质询、序列号、卡质询和“8000...”填充以生成签名的明文。使用会话密钥对其进行签名,结果应与卡密码匹配。一旦我可以复制供应商工具计算,我就可以在我的个人机器上使用相同的代码。简单易行。

在 .Net 4.5 TripleDESCryptoServiceProvider 和 MACTripleDES 中工作时,我得到的值不匹配。我不愿意集成 Bouncy Castle 只是为了看看它是否能让事情变得更好。我的密钥计算在 internet calculators 上得到验证,但我当然看不到卡的会话密钥。在线签名计算器不同意我的代码,但他们也不同意示例数据。我所知道的是签名是错误的,或者至少与工作工具不同。

所以我想问题是,在任何地方都可以找到这种计算的例子吗?当然是先问芯片厂商了。

Python 中的一个示例是 Asterix 项目: https://github.com/suma12/asterix

对该项目中的 SCP02.py 进行少量分割就足以 运行 并复制我的示例数据。