首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在安全信道协议3 (SCP03)中,CMAC使用什么AES模式?

在安全信道协议3 (SCP03)中,CMAC使用什么AES模式?
EN

Cryptography用户
提问于 2022-06-20 22:45:26
回答 2查看 401关注 0票数 2

我期待着验证一个卡片密码发送从智能卡芯片按照SCP03。根据SCP03规范,CMAC用于生成一个MAC来验证发送到或来自安全元素的消息。

SCP03规范说,CBC模式下的AES用于加密和解密,但在CBC.

中使用的是什么模式尚不清楚。

目前我使用的是OMAC1,它在欧洲央行模式下使用AES。我的CMAC (在KDF计数器模式下)与NIST (https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/KBKDF800-108/CounterMode.zip)提供的测试向量一起工作,但是,在与安全元素对话时,我没有生成正确的卡密码。

我已经检查了CMAC的键和固定输入数据是否正确。

术语笼统地混淆如下:

  • AES-CBC != AES-CMAC (但如果AES-CMAC使用CBC,那么它是否与AES-CBC.
  • OMAC1 == AES-CMAC (但OMAC1使用ECB与AES-CMAC可以使用任何AES模式.)

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字节输出长度。

下面是来自安全元素的一个示例单元测试,该测试失败了:

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

TLDR -> SCP03中的CMAC在CBC模式下使用AES吗?

EN

回答 2

Cryptography用户

发布于 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应用于加密结果?也许实际上不需要加密?

票数 1
EN

Cryptography用户

发布于 2022-06-22 19:47:01

我在CBC模式下实现了从CMAC到AES的CMAC.CBC-MAC -顾名思义-当然可以使用CBC实现,只要您有一些空间暂时存储不必要的密文块。然而,正如注释中所指出的,AES通常被简单地表示为分组密码,CMAC和派生的CMAC就像CBC模式一样。

如果必须选择一种模式,那么没有填充的欧洲央行模式与分组密码是完全相同的。对于CBC,您必须使用一个块和一个零IV,但是您肯定可以不使用零值的XOR。

如果CMAC计算符合测试向量(包括由128位/ 16字节块的精确倍数组成的向量),那么CMAC计算可能是正确的。之后,它将确保计算中包含正确的字节。

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

https://crypto.stackexchange.com/questions/100691

复制
相关文章

相似问题

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