我期待着验证一个卡片密码发送从智能卡芯片按照SCP03。根据SCP03规范,CMAC用于生成一个MAC来验证发送到或来自安全元素的消息。
中使用的是什么模式尚不清楚。
目前我使用的是OMAC1,它在欧洲央行模式下使用AES。我的CMAC (在KDF计数器模式下)与NIST (https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/KBKDF800-108/CounterMode.zip)提供的测试向量一起工作,但是,在与安全元素对话时,我没有生成正确的卡密码。
我已经检查了CMAC的键和固定输入数据是否正确。
术语笼统地混淆如下:
SCP03 CMAC规范声明(链接如下):
链接2第4.1.3节:
NIST 800-38B中指定的CMAC用于MAC计算。注意,NIST 800-38B还指定要应用于输入的填充。这符合FIPS 140-2附件A(消息认证- 3)。
链接-2第4.1.5节:
数据推导应在NIST 800-108 NIST 800-108中指定的计数器模式下使用KDF。在KDF中使用的PRF应该是NIST 800-38B中指定的CMAC,并且使用完整的16字节输出长度。
下面是来自安全元素的一个示例单元测试,该测试失败了:
// The static key used to generate the session MAC key
uint8_t key_raw[16] = { 0x58, 0x56, 0x33, 0x62, 0xEC, 0x5A, 0x45, 0x41, 0xAB, 0xCD, 0x32, 0xB3, 0x4B, 0x1E, 0xAE, 0x7D };
// Used to generate the session MAC key
uint8_t key_derivation_data_raw[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, // derivation constant
0x00, // separator byte
0x00, 0x80, // length
0x01, // iteration counter
0xA6, 0xFE, 0xFE, 0xAE, 0xB2, 0xE1, 0x27, 0x18, // host challenge
0x51, 0x70, 0xF4, 0x5F, 0xCA, 0x00, 0x00, 0x15 }; // card challenge
// Used to generate the card cryptogram
uint8_t data_raw[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // derivation constant
0x00, // separator byte
0x00, 0x80, // length
0x01, // iteration counter
0xA6, 0xFE, 0xFE, 0xAE, 0xB2, 0xE1, 0x27, 0x18, // host challenge
0x51, 0x70, 0xF4, 0x5F, 0xCA, 0x00, 0x00, 0x15 }; // card challenge
// Card cryptogram
uint8_t expected_output[8] = { 0xB0, 0x1E, 0x60, 0x94, 0xFC, 0x7E, 0x25, 0xCF };相关链接:
链接-1 NIST 800-38B链接:https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-38b.pdf 链接-2 SCP03 Link (第4.1.3和4.1.5节有意义):https://globalplatform.org/wp-content/uploads/2014/07/GPC
发布于 2022-06-20 23:26:59
-> SCP03中的CMAC是否在CBC模式下使用AES?
在不熟悉的SCP03协议,但混乱的根源是如何使用AES在CMAC。从技术上讲,我们不需要在CMAC的上下文中讨论“模式”。在这种情况下,AES作为块密码使用16字节键,16字节blob,并返回另外16字节blob。CBC之类的模式是指使用块密码加密任意长度的数据。
尽管如此,出于所有的意图和目的,我上面提到的分组密码用法也可以被看作是欧洲央行模式下的AES。事实上,欧洲央行包括将要被“加密”的信息分割成16个字节,并在每个块上应用AES分组密码(或其他任何内容)。所以AES-ECB对单个16字节的blob和使用AES分组密码是一样的.
我也不知道用来测试所有这些的软件是如何构造的,但我猜想解决方案是在CMAC的实现中“使用AES-ECB”。除此之外,还需要检查接收方所期望的加密模式。也许您必须首先使用AES-CBC加密数据,然后将CMAC应用于加密结果?也许实际上不需要加密?
发布于 2022-06-22 19:47:01
我在CBC模式下实现了从CMAC到AES的CMAC.CBC-MAC -顾名思义-当然可以使用CBC实现,只要您有一些空间暂时存储不必要的密文块。然而,正如注释中所指出的,AES通常被简单地表示为分组密码,CMAC和派生的CMAC就像CBC模式一样。
如果必须选择一种模式,那么没有填充的欧洲央行模式与分组密码是完全相同的。对于CBC,您必须使用一个块和一个零IV,但是您肯定可以不使用零值的XOR。
如果CMAC计算符合测试向量(包括由128位/ 16字节块的精确倍数组成的向量),那么CMAC计算可能是正确的。之后,它将确保计算中包含正确的字节。
https://crypto.stackexchange.com/questions/100691
复制相似问题